Re: Dexterity performance issues.

Laurence Rowe <[email protected]>
Newsgroups gmane.comp.web.zope.plone.devel
Message-ID <CAOycyLRSpQYAsyga8rytVok2C=JSvNnDR1c5EyypvCW-3OLsgg@mail.gmail.com>
Would setting the acquired attributes to Acquisition.Acquired be enough?
That would avoid the call to __getattr__ completely.
https://pypi.python.org/pypi/Acquisition#controlling-acquisition

Laurence

On 16 May 2014 09:20, David Glick (Plone) <david.glick-z4DKO/[email protected]> wrote:

> Hmm, the benchmarking I did early in Dexterity's life suggested that it
> was roughly comparable in performance to Archetypes. It's possible that
> a regression has happened since then, or it's possible that that
> benchmark didn't adequately cover this use case.
>
> Thanks for providing your benchmark code so others can investigate.
>
> On 5/16/14, 8:37 AM, Matt Hamilton wrote:
> > After digging around for most of a day, it seems like the main culprit
> is the __get__ call in p.dexterity.content.FTIAwareSpecification:
> >
> https://github.com/plone/plone.dexterity/blob/master/plone/dexterity/content.py#L69
> >
> > In short, this is a method that on AT types is in C, and in Dexterity is
> in Python (I think). The DX call also has a mutex around a module level
> schema cache which may not be helping things (although in this case there
> is only one thread). In this *specific* case, setting a class-level
> attribute of __ac_local_roles_block__ = None does help as is means that
> accessing that attribute on a DX object stops there and don’t trigger then
> custom __getattr__ code. But it is a wider problem. Anytime you call e.g.
> IFoo.providedBy(my_dx_object) then it takes a long time… and we do that *a
> lot*.
> >
> I have a branch I never finished up where I added a list of attributes
> that are commonly missing or acquired to make sure that __getattr__
> doesn't try to look them up as fields. Does this help at all?
>
> +MISSING_OR_ACQUIRED_ATTRIBUTES = frozenset([
> +    '__allow_groups__',
> +    '__annotations__',
> +    '__bobo_traverse__',
> +    '__cmp__',
> +    '__conform__',
> +    '__provides__',
> +    '_dav_writelocks',
> +    '_EtagSupport__etag',
> +    '_isPortalRoot',
> +    '_is_wrapperish',
> +    '_owner',
> +    '_plone.uuid',
> +    '_subobject_permissions',
> +    '_v__providedBy__',
> +    'aq_inner',
> +    'dav__title',
> +    'default_page',
> +    'displayContentsTab',
> +    'document_src',
> +    'externalEditorEnabled',
> +    'im_self',
> +    'index_html',
> +    'isTemporary',
> +    'folder_listing',
> +    'getCurrentSkinName',
> +    'getCustomNavQuery',
> +    'getFolderContents',
> +    'getRawRelatedItems',
> +    'getURL',
> +    'global_cache_settings',
> +    'global_statusmessage',
> +    'layout',
> +    'kss_generic_macros',
> +    'main_template',
> +    'plone_utils',
> +    'portal_actions',
> +    'portal_catalog',
> +    'portal_css',
> +    'portal_factory',
> +    'portal_javascripts',
> +    'portal_kss',
> +    'portal_languages',
> +    'portal_membership',
> +    'portal_placeful_workflow',
> +    'portal_properties',
> +    'portal_types',
> +    'portal_url',
> +    'portal_workflow',
> +    'role_map',
> +    'sort-on',
> +    'sort-limit',
> +    'sort-order',
> +    'translation_service',
> +    'view',
> +    ])
> +
> +
>   class DexterityContent(DAVResourceMixin, PortalContent,
> DefaultDublinCoreImpl, Contained):
>       """Base class for Dexterity content
>       """
> @@ -183,13 +244,15 @@ class DexterityContent(DAVResourceMixin,
> PortalContent, DefaultDublinCoreImpl, C
>       description = u''
>
>       def __getattr__(self, name):
> -        # optimization: sometimes we're asked for special attributes
> -        # such as __conform__ that we can disregard (because we
> -        # wouldn't be in here if the class had such an attribute
> -        # defined).
> -        if name.startswith('__'):
> +        """Return default values for fields that don't have a value
> stored."""
> +        # optimization: avoid checking the schema for names that
> +        # are expected to be missing or acquired
> +        if name in MISSING_OR_ACQUIRED_ATTRIBUTES \
> +                or name.endswith('_Permission'):
>               raise AttributeError(name)
>
>
> ------------------------------------------------------------------------------
> "Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
> Instantly run your Selenium tests across 300+ browser/OS combos.
> Get unparalleled scalability from the best Selenium testing platform
> available
> Simple to use. Nothing to install. Get started now for free."
> http://p.sf.net/sfu/SauceLabs
> _______________________________________________
> Plone-developers mailing list
> Plone-developers-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
> https://lists.sourceforge.net/lists/listinfo/plone-developers
>

------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs

_______________________________________________
Plone-developers mailing list
Plone-developers-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f@public.gmane.org
https://lists.sourceforge.net/lists/listinfo/plone-developers
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.