Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
1.5.3
-
None
Description
Wicket 1.5 is slower than 1.4 in rendering deep component trees.
See the attached application that adds recursively components with specified depth. In 1.5 it is several times slower than 1.4.
I found several problems:
1) org.apache.wicket.Component.configure() calls org.apache.wicket.Component.setRenderAllowed()
The problems is that configure() is called for each component in the hierarchy and setRenderAllowed() is overwritten in MarkupContainer to visit all children and call it for them. And the final result is that setRenderAllowed() is called for the parent and all its children, then for the first child and all its children again, and so on...
The solution is to completely remove org.apache.wicket.MarkupContainer.setRenderAllowed()
2) If you increase the number of components to > 1000 in 1.5 we hit StackOverflowError in
2.1) org.apache.wicket.MarkupContainer.getMarkupType()
2.2) org.apache.wicket.Component.getLocale()
2.3) org.apache.wicket.MarkupContainer.internalMarkRendering(boolean)
For 2.1 and 2.2 I suggest to add transient fields which will cache the calculated value after the first call of the get method.
For 2.3 I don't see a solution for now