Header Image

Translate

vrijdag 5 augustus 2016

Performance compileren productbuilder

In Ax 4.0 genereerd de productbuilder effectief een class welke middels code de bepaling zoals visueel is weergegeven in X++ vertaald. Bij complexe modellen kan het zijn de class hierdoor 1000-en methoden krijgt. Dit is onvoorkomenlijk, inherent aan de technische realisatie van deze functionaliteit.

Het kan echter voorkomen dat het compileren van een productmodel het systeem laat bevriezen. Een model dat 2975 methoden genereerd, gaf ik na 30 minuten de opdracht tot afbreken. De oorzaak zit hem in de compiler van deze funcionaliteit;


Effectief: ga alle methodes langs en verwijder deze. Bij 2975 methoden doet dit meer dan een seconde per methode, dus ongeveer 50 minuten. Dat is slechts één onderdeel van de stappen, maar de oorzaak waarom het lang duurt.

Dit heb ik vervangen door het volgende:

Effectief: verwijder de class en maak deze opnieuw aan met behoud van ID. Anders gaat het ID's gebruiken en dat is minder makkelijk als in dezelfde laag ook nog ontwikkeld wordt in een DEV omgeving en er ID conflicten gaan ontstaan.

code:
    TreeNode            methodNode;
    TreeNodeIterator    nodeIterator;
    UtilIdElements  utilIdElements; // INT561
    TreeNode tn;
    ;

    if (useClasses)
    {
        classBuild.classNode().AOTrestore();
        classBuild.classNode().AOTsave();

        // INT561
        // Drop & recreated with existing ID much more efficient then
        //  delete all subnodes (methods).
        utilIdElements.initValue();
        utilIdElements.Name = classBuild.classNode().name();
        utilIdElements.recordType = UtilElementType::Class;
        utilIdElements.Id = classbuild.classNode().iD();
        classBuild.classNode().AOTdelete();
        utilIdElements.insert();

        tn = xUtilIdElements::getNode(utilIdElements);
        if (tn)
        {
            tn.AOTcompile(1);
            tn.AOTsave();
        }
        classBuild = new classBuildConfigurator(utilIdElements.name, true);
        // INT561

        this.addSource2TreeSource(PBA::_pbaSourceArgs() + PBA::cr() + PBA::start() + PBA::cr() + PBA::tabSpace() + PBA::callSuper() + PBA::cr() + PBA::tabSpace() + PBA::PBAInitCall(useClasses) + PBA::cr());
Hierbij heb ik gebruik gemaakt van deze link:
 http://www.axaptapedia.com/ClassBuild_Class