I am currently working on a project where we are evaluating wheter to
use Velocity or WebMacro. I did some performance test in relation to how
we intend to use either of the parsing engines.

We are making a Web UI framework, and its very much based on nesting
components. IE. you have a frame, and inside it you have various
sections, which again contains components. So you end up with nesting
alot of components and their associated template files.

In order to test things the way we used it, I made a simple Class that
would have an associated VM/WM file, and recurse several levels deep.

Full code can be found here:
http://apollo.coretrek.com/~staaleu/VelocityPerformance.tar.gz

Dependent packages are here:
http://apollo.coretrek.com/~staaleu/

There is a slight difference in code from WM 1.1 to 2.0, commented on
line 91 of NestedObject.java

The basic constructor of the class is as follows:

________________________________
    public NestedObject() {
        this(0);
    }

    private NestedObject(int level) {
        _level = level;
        for (int i=0; i<level; i++) {
            _indentation+="  ";
        }
        if (_level == LEVELS) {
            _nested = Collections.EMPTY_LIST;
        }
        else {
            _nested = new ArrayList(CHILD_COUNT);
            for (int i = 0; i < CHILD_COUNT; i++) {
                _nested.add(new NestedObject(_level + 1));
            }
        }
    }
________________________________

So creating a NestedObject, creates a tree of child objects. The Class
has an associated VM/WM file that looks like this:
________________________________
$this.getIndentation()START LEVEL $this.Level
#foreach ($obj in $this.Nested)
$obj
#end
$this.getIndentation()END   LEVEL $this.Level
________________________________

Basically recursing several levels deep.

For the WebMacro part, I use the Macro interface, which means I get an
outputstream in to write each object to. For Velocity I had to use the
toString() method, so a seperate String would be created for each level.

Here are the test results as I got them:
WebMacro 1.1 init memoryConsumption: 1346552
Run: 0, memoryConsumption: 926968, time: 439ms, size: 67179
Run: 10, memoryConsumption: 467648, time: 54ms, size: 67179
Run: 20, memoryConsumption: 468128, time: 54ms, size: 67179
Run: 30, memoryConsumption: 468320, time: 54ms, size: 67179
Run: 40, memoryConsumption: 468320, time: 64ms, size: 67179
Run: 50, memoryConsumption: 468128, time: 56ms, size: 67179
Run: 60, memoryConsumption: 468320, time: 66ms, size: 67179
Run: 70, memoryConsumption: 468320, time: 57ms, size: 67179
Run: 80, memoryConsumption: 468128, time: 55ms, size: 67179
Run: 90, memoryConsumption: 468320, time: 54ms, size: 67179
Run: 100, memoryConsumption: 468320, time: 54ms, size: 67179
Total time for WebMacro: 7416

WebMacro 2.0 init memoryConsumption: 456808
Run: 0, memoryConsumption: 713456, time: 1668ms, size: 67179
Run: 10, memoryConsumption: 608160, time: 145ms, size: 67179
Run: 20, memoryConsumption: 608208, time: 346ms, size: 67179
Run: 30, memoryConsumption: 608160, time: 157ms, size: 67179
Run: 40, memoryConsumption: 580208, time: 154ms, size: 67179
Run: 50, memoryConsumption: 608160, time: 146ms, size: 67179
Run: 60, memoryConsumption: 608208, time: 1534ms, size: 67179
Run: 70, memoryConsumption: 608400, time: 144ms, size: 67179
Run: 80, memoryConsumption: 580208, time: 149ms, size: 67179
Run: 90, memoryConsumption: 608160, time: 143ms, size: 67179
Run: 100, memoryConsumption: 608208, time: 146ms, size: 67179
Total time for WebMacro2: 20406

Velocity 1.4 init memoryConsumption: 2280416
Run: 0, memoryConsumption: 1872776, time: 2063ms, size: 67179
Run: 10, memoryConsumption: 1729616, time: 1074ms, size: 67179
Run: 20, memoryConsumption: 1707664, time: 1037ms, size: 67179
Run: 30, memoryConsumption: 1707624, time: 1076ms, size: 67179
Run: 40, memoryConsumption: 1707624, time: 1414ms, size: 67179
Run: 50, memoryConsumption: 1707624, time: 1018ms, size: 67179
Run: 60, memoryConsumption: 1707624, time: 1037ms, size: 67179
Run: 70, memoryConsumption: 1707576, time: 1152ms, size: 67179
Run: 80, memoryConsumption: 1707624, time: 1090ms, size: 67179
Run: 90, memoryConsumption: 1707624, time: 1501ms, size: 67179
Run: 100, memoryConsumption: 1707640, time: 1032ms, size: 67179
Total time for Velocity: 130396

Please note that WebMacro 2.0 produces errornous output, but thats not
for this list.

Am I using Velocity totally wrong? Is there interfaces that allows me to
nest objects and have good performance?

Here is the full code for the NestedObject, which handles the output:
http://apollo.coretrek.com/~staaleu/NestedObject.java.txt

-- 
Ståle Undheim
Systemutvikler

CoreTrek
Tlf.:   +47 51 97 85 97
E-post: [EMAIL PROTECTED]
WEB:    www.coretrek.no

"Simple is beautiful"

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to