Verbesserung
Top-Thema
Detail
Wichtig
Detail
Das TL-Modell wird immer häufiger verwendet. Dadurch fällt immer häufiger auf, dass es dabei zu Performance-Problemen kommen kann. Insbesondere wenn die Typ-Hierarchie benötigt wird, ist das ein Problem: In solchen Fällen wird bei jedem Aufruf die gesamte Hierarchie rekursiv nach oben oder unten durchsucht, wobei selbst doppelte Pfade nicht als solche erkannt sondern mehrfach traversiert werden.
Verbesserung
Insbesondere Methoden wie TLModelUtil.isCompatibleInstance(...) und getConcreteSpecializations sollen einen Cache verwenden sowie von vornherein unnötigen Aufwand durch zum Beispiel doppelte Pfade im Modell vermeiden. Auch die anderen Methoden im tl:TLModelUtil sollen auf ihr Optimierungspotential hin überprüft werden.
Anwendung
Der Cache wurde in tl:TLModelUtil eingebaut und wird automatisch verwendet. Falls dieser Cache dennoch direkt aufgerufen werden soll, geht das zum Beispiel so: {{{#!java TLModelCacheService.get().getSubClasses(TLClass) }}}
Der Cache wurde so eingebaut, dass diese Aufrufe auch dann funktionieren, wenn der Cache abgeschaltet ist. Dann wird das Ergebnis wie bisher für jeden Aufruf neu berechnet.
Ergebnis
Die Test vom Demo im nächtlichen Build sind dadurch etwa 10% schneller geworden: 33 Minuten statt 36 Minuten.
Code Migration
- TLModelUtil.calcAllSuperClasses(TLClass) und TLClass.getAllSuperClasses() ` ersetzen durch `TLModelUtil.getReflexiveTransitiveGeneralizations(TLClass).
- MetaElementUtil.getAllSubMetaElements(TLClass) ersetzen durch TLModelUtil.getTransitiveSpecializations(TLClass).
- MetaElementUtil.getConcreteTransitiveSpecializations(TLClass) ersetzen durch TLModelUtil.getConcreteSpecializations(TLClass).
- MetaElementUtil.getSuperMetaElements(TLClass) ersetzen durch TLClass.getGeneralizations().
- TLModelUtil.getSubMetaElements(TLClass) ersetzen durch TLClass.getSpecializations().
- TLModelUtil.calcAllParts(TLClass) ersetzen durch TLClass.getAllClassParts().
- TLModelUtil.getAllGlobalClasses(TLModel) liefert ein Set statt einer List.
- Folgende Methoden liefern jetzt unveränderbare Collections, da sie direkt Werte aus dem Cache liefern:
- TLModelUtil.getMetaAttributes(TLClass)
- TLStructuredType.getAllParts()
- TLClass.getAllClassParts()
Test
TestTLModelUtilPersistent wurde um entsprechende Tests erweitert. Das transiente tl:TLModel testet den Cache nicht, weil der nur für das persistente tl:TLModel aktiv ist. Die Korrektheit der berechneten Werte im Cache wird bereits durch die normalen Tests des persistenten TLModels überprüft. Daher prüfen die neuen Tests nur das Caching an sich: Wird bei jedem Aufruf tatsächlich das gleiche Objekt zurückgeliefert? Und sind die Werte die der Cache liefert unmodifiable?