[Zope] For the record
Dieter Maurer
dieter at handshake.de
Wed Mar 19 14:48:23 EDT 2008
Peter Bengtsson wrote at 2008-3-18 17:38 +0000:
>I wanted to see how much faster brain.getObject() would be if the
>returned object was located in a BTreeFolder versus a normal folder so
>I wrote a benchmark that created about 10,000 light simple objects in
>two distinctly different containers and each with a ZCatalog that has
>a PathIndex.
>
>I would expect the BTreeFolder parenting calls of brain.getObject() to
>be much faster but I found that there was NO DIFFERENCE. wtf?!
If you access many (most) objects, these accesses may be even
more expensive with a "BTreeFolder" than with a standard folder.
This is not that difficult to explain:
When you access a normal folder, with the folder all child
references are loaded. When you later access the folder
again (and it has not yet been flushed from the ZODB cache),
no loading is necessary.
When you access a "BTreeFolder", no child references are loaded.
Thus, elementary access to a "BTreeFolder" is much more
efficient.
When you access a child in a "BTreeFolder", then all child
references are loaded that are in the same bucket as the
access child. In addition, all nodes on the path
from the "BTreeFolder" to this bucket are loaded.
When you access many children, you have a good chance,
that you have accessed at least on child in each bucket.
In this case, you have loaded all child references (as
in the standard folder case). In addition, you have
loaded the complete access structure.
To summarize: an isolated access to a child of a large "BTreeFolder"
is usually much more efficient than an isolated access to a standard
folder with the same children. However, the advantage of the
"BTreeFolder" decreases when lots of children are accessed.
--
Dieter
More information about the Zope
mailing list