Le 04/05/2011 11:53, Hanno Schlichting a écrit :
> I tried to analyze the overhead of changing content in Plone a bit. It
> turns out we write back a lot of persistent objects to the database,
> even tough the actual values of these objects haven't changed.
> Digging deeper I tried to understand what happens here:
> 1. persistent.__setattr__ will always set _p_changed to True and thus
> cause the object to be written back
> 2. Some BTree buckets define the "VALUE_SAME" macro. If the macro is
> available and the new value is the same as the old, the change is
> 3. The VALUE_SAME macro is only defined for the int, long and float
> value variants but not the object based ones
> 4. All code in Products.ZCatalog does explicit comparisons of the old
> and new value and ignores non-value-changes. I haven't seen any other
> code doing this.
> I'm assuming doing a general check for "old == new" is not safe, as it
> might not be implemented correctly for all objects and doing the
> comparison might be expensive.
I know very few of ZODB internals but in Python "old == new" does not
means "old is new"
I don't know the way ZODB retrieve a particular object exactly but I
assume it does this using _p_oid. So for persistant classes you could
check old._p_oid == new._p_oid. For string, int you can of course use
old is new.
Sorry if I'm wrong, as I may miss lot of thing !
For more information about ZODB, see the ZODB Wiki:
ZODB-Dev mailing list - ZODB-Dev@zope.org