[
https://issues.apache.org/jira/browse/VELOCITY-607?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12617112#action_12617112
]
Nathan Bubna commented on VELOCITY-607:
---------------------------------------
So, it seems that synchronization is not the main problem. It seems like there
is a lot of work being re-done. When the template is parsed, each *use* of a
macro in that template creates an instance of RuntimeMacro and a
VelocimacroProxy. That's fine and to be expected. What surprised me is that
when you render the template (even when cached), each *render* of that template
creates its own VelocimacroProxy instance and a VMProxyArg instance. In other
words, it appears that every time a macro is rendered, it's content is
re-parsed into an AST. That seems pretty overkill.
I don't really have any more time to investigate, but there's got to be a
better way to do this. But, if we can't find a way, then i'd want to revert
the changes that caused this. Given the choice between this constant
re-parsing and not being able to include macros via #parse calls, i would
prefer the latter. Inconvenience is better than terrible performance.
Hopefully, it won't come to that, and we'll just find a way to avoid all this
repetition.
> 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]