Mvel的性能很不错(Mvel主要竞争对手是OGNL),这个是官方提供的性能数据,因为Mvel使用asm,采用了编译成java字节码的方式,其本质的性能应该和java代码的性能是类似的。不过在实际测试器模板的时候,其性能并没有非常突出:
测试代码:主要比较了完成同一个功能,java、velocity、mvel需要的时间
velocity对SimpleNode进行Cache之后进行测试,同样Mvel也是编译之后进行测试。发现两者的CPU性能相差不大,在同一数量级,而java则明显高很多,当然和java的写法也有关系。 看来还需要再看一下Mvel编译之后的代码!
public class Main {
private static Map vars = new HashMap();
private static VelocityContext context = new VelocityContext();
private static RuntimeInstance ri = new RuntimeInstance();
static {
Group g = new Group("group1");
for (int i = 0; i < 20; i++) {
g.addUser(new User(i, "user" + i));
}
vars.put("group", g);
vars.put("name", "john");
context.put("group", g);
context.put("name", "john");
}
private static String mvelTemplate = "Hello, my name is @{name.toUpperCase()},"
+ " @foreach{user : group.users} - @{user.id} - @{user.name} "
+ " @end{}";
private static String velocityTemplate = "Hello, my name is ${name.toUpperCase()},"
+ "#foreach($user in $group.users) - ${user.id} - ${user.name} #end " ;
public static String java(Map vars ) {
StringBuffer sb = new StringBuffer();
sb.append("Hello, my name is ");
String name = (String)vars.get("name");
sb.append(name.toUpperCase());
Group group = (Group)vars.get("group");
for (User u : group.getUsers()) {
sb.append(" - ");
sb.append(u.getId());
sb.append(" - ");
sb.append(u.getName());
}
return sb.toString();
}
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Velocity.init();
CompiledTemplate compiled = TemplateCompiler.compileTemplate(mvelTemplate);
for (int i = 0; i < 10; i++) {
/** 未编译的mvel模板效率*/
long start = System.currentTimeMillis();
for (int n = 0; n < 10000; n ++) {
TemplateRuntime.eval(mvelTemplate, vars);
}
long end = System.currentTimeMillis();
System.out.println("Mvel.NoCompiled elapsed:" + (end - start) );
/** 编译后的mvel模板效率*/
start = System.currentTimeMillis();
for (int n = 0; n < 10000; n ++) {
TemplateRuntime.execute(compiled, vars);
}
end = System.currentTimeMillis();
System.out.println("Mvel.Compiled elapsed:" + (end - start) );
/** Velocity模板效率*/
NullWriter writer = new NullWriter();
SimpleNode snode = ri.parse(velocityTemplate, "velocityTest" );
start = System.currentTimeMillis();
for (int n = 0; n < 10000; n ++) {
/* lets render a template */
ri.render(context, writer, "velocityTest", snode);
// Velocity.evaluate(context, writer, "velocityTest", velocityTemplate);
}
end = System.currentTimeMillis();
System.out.println("Velocity Cache elapsed:" + (end - start) );
/** Velocity模板效率*/
//start = System.currentTimeMillis();
//for (int n = 0; n < 10; n ++) {
/* lets render a template */
// Velocity.evaluate(context, writer, "velocityTest", velocityTemplate);
//}
//end = System.currentTimeMillis();
//System.out.println("Velocity No Cache elapsed:" + (end - start) );
/** java代码效率*/
start = System.currentTimeMillis();
for (int n = 0; n < 10000; n ++) {
java(vars);
}
end = System.currentTimeMillis();
System.out.println("Java elapsed:" + (end - start) );
}
}
}
测试结果:
Mvel.NoCompiled elapsed:7970
Mvel.Compiled elapsed:359
Velocity Cache elapsed:625
Java elapsed:93
Mvel.NoCompiled elapsed:6250
Mvel.Compiled elapsed:328
Velocity Cache elapsed:578
Java elapsed:78
Mvel.NoCompiled elapsed:6710
Mvel.Compiled elapsed:328
Velocity Cache elapsed:562
Java elapsed:47
Mvel.NoCompiled elapsed:6090
Mvel.Compiled elapsed:343
Velocity Cache elapsed:516
Java elapsed:46
Mvel.NoCompiled elapsed:7190
Mvel.Compiled elapsed:312
Velocity Cache elapsed:515
Java elapsed:47
Mvel.NoCompiled elapsed:6090
Mvel.Compiled elapsed:297
Velocity Cache elapsed:530
Java elapsed:47
Mvel.NoCompiled elapsed:6250
Mvel.Compiled elapsed:297
Velocity Cache elapsed:515
Java elapsed:47
Mvel.NoCompiled elapsed:6090
Mvel.Compiled elapsed:312
Velocity Cache elapsed:515
Java elapsed:47
Mvel.NoCompiled elapsed:7810
Mvel.Compiled elapsed:328
Velocity Cache elapsed:530
Java elapsed:32
Mvel.NoCompiled elapsed:6090
Mvel.Compiled elapsed:359
Velocity Cache elapsed:531
Java elapsed:46