[
https://issues.apache.org/jira/browse/VELOCITY-607?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12617927#action_12617927
]
Jarkko Viinamäki commented on VELOCITY-607:
-------------------------------------------
Nathan is right. I have analyzed the code a lot and there is massive amount of
rework done. Every time a macro is used, a new VelocimacroProxy is created and
the macro is reparsed from string to AST. Then each macro argument is reparsed
from string to AST. For each macro argument a new VMProxyArg is created. In
addition, a new VMContext is created every time a macro is called (2 HashMaps).
This means a lot of memory allocation which is slow and lots of garbage.
Also when the macro is parsed the first time (Macro directive) the already
parsed AST is turned back into a String and stored.
I mercilessly refactored the code and I managed to create an implementation
which passes all current tests and a) uses shared AST for all macros, b) uses
shared VelocitymacroProxy c) uses call by reference for macro arguments
(instead of call by value). With these modifications the performance is very
close to 1.5 with the template in this issue but not quite there yet.
I'll see if I can tweak the refactored design a bit more but it's already
several times faster than current one.
> Runtime macro rendering very slow in Velocity 1.6-dev (679708) compared to 1.5
> ------------------------------------------------------------------------------
>
> Key: VELOCITY-607
> URL: https://issues.apache.org/jira/browse/VELOCITY-607
> Project: Velocity
> Issue Type: Bug
> Components: Engine
> Environment: Maven 2, JUnit, JUnitPerf, JRat, custom testbench:
> http://www.iki.fi/wyla/velocity/testbench
> Reporter: Jarkko Viinamäki
> Priority: Critical
> Fix For: 1.6
>
> Attachments: velocity-1.5-velocity24-test.PNG,
> velocity-1.6-head-20080725-velocity24-test.PNG
>
>
> The following test template (see VELOCITY-24):
> ## local macro, not global
> #macro(letter $char)
> This is the letter $char
> #end
> #letter("A")
> #letter("B")
> #letter("C")
> #letter("D")
> #letter("E")
> #letter("F")
> #letter("G")
> #letter("H")
> #letter("I")
> #letter("J")
> #letter("K")
> #letter("L")
> #letter("M")
> #letter("N")
> #letter("O")
> #letter("P")
> #letter("Q")
> #letter("R")
> #letter("S")
> #letter("T")
> #letter("U")
> #letter("V")
> #letter("W")
> #letter("X")
> #letter("Y")
> #letter("Z")
> ---
> Works quickly and correctly with Velocity 1.5 with several concurrent
> threads. However, 1.6-dev is a LOT slower (even 20x).
> The major performance bottlenecks seem to be:
> RuntimeMacro.render (60% of time)
> VelocimacroFactory.getVelocimacro (20% of time)
> With several threads this test also causes Velocity to throw error(s):
> org.apache.velocity.exception.MacroOverflowException: Exceed maximum 20 macro
> calls. Call Stack:letter->letter->letter->letter->letter
> at
> org.apache.velocity.runtime.VelocimacroFactory.startMacroRendering(VelocimacroFactory.java:179)
> at
> org.apache.velocity.runtime.RuntimeInstance.startMacroRendering(RuntimeInstance.java:1693)
> at
> org.apache.velocity.runtime.directive.VelocimacroProxy.render(VelocimacroProxy.java:200)
> at
> org.apache.velocity.runtime.directive.RuntimeMacro.render(RuntimeMacro.java:230)
> at
> org.apache.velocity.runtime.parser.node.ASTDirective.render(ASTDirective.java:178)
> at
> org.apache.velocity.runtime.parser.node.SimpleNode.render(SimpleNode.java:323)
> at org.apache.velocity.Template.merge(Template.java:324)
> at org.apache.velocity.Template.merge(Template.java:232)
> at
> org.apache.velocity.test.load.Velocity24Test.testRendering(Velocity24Test.java:51)
> This is related to VELOCITY-297 but the fix doesn't seem work with the new
> modified macro implementation.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]