`
jjw
  • 浏览: 65473 次
文章分类
社区版块
存档分类
最新评论

Mvel模板性能测试

阅读更多

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

 

分享到:
评论
4 楼 sunwudie 2015-06-15  
MVEL支持单步调试么  或者是怎样看错误报告
3 楼 almtalmt 2012-04-30  
楼主,group和user是自己建的类吗?
2 楼 raymond2006k 2010-12-12  
补充一下, 楼主可以试试实际场景下的Template, 通常数据量比较大,可能性能差距更明显。
1 楼 raymond2006k 2010-12-12  
  很好很有价值的对比分析! 鼎你! 我最近也在做这方面的优化工作。

1 Mvel 编译后性能上升非常明显,但编译后只略微比Velocity快一点。 我想,主要是因为Mvel未做任何形式的 Cache, 而Velocity对 Node以及渲染做了很多cache优化。因此,我们在公司内讨论 Velocity 的性能时,大家并不担心。

2. 而为什么 编译式Mvel 仍然比 原生Java字节码慢很多。我想,根本原因还是 Mvel 没有脱离动态语言的本质。它是基于 AST Node Tree进行编译的,产生的字节码(我猜测一下)还是基于 Node进行反射调用。 所以,性能就差在 反射 和 Java 原生的调用上。根据我的经验测试, JDK6 下,也就是 10倍左右。

   因此,要根本优化动态模板, 还是要实现强类型静态化模板。

参考《半静态语言–原理和价值分析》 http://www.infoq.com/cn/articles/hk-semi-static-language

相关推荐

    \\(^_^)/ 表达式解析器(MVEL)

    **表达式解析器(MVEL)** MVEL是一个强大的动态脚本语言,主要设计用于简化表达式的解析和执行。它在Java生态系统中广泛使用,尤其在Spring框架和其他项目中,用作快速、轻量级的表达式语言。MVEL提供了一种简洁的...

    MVEL 2.0表达式语言

    通过提供的`mvel`文件,可能包含了MVEL 2.0的API文档、示例代码、测试用例或库的源码。这些资源可以帮助你深入了解MVEL的工作原理,学习如何在实际项目中有效利用它。 总之,MVEL 2.0表达式语言是一个强大且灵活的...

    mvel-maven-plugin:MVEL 模板 maven 插件

    mvel-maven-插件 使用 MVEL 渲染模板的 Maven 插件。 用法 &lt; groupId&gt;uk.co.codezen &lt; artifactId&gt;mvel-maven-plugin &lt; version&gt;1.0 &lt; goal&gt;render &lt; template

    mvel2.0语法指南.pdf

    MVEL 2.0 版本在继承 Java 语法的基础上进行了大量优化,以提高性能并简化开发流程。本文档旨在详细介绍 MVEL 2.0 的核心概念及其语法特点,帮助开发者更好地理解和运用这一工具。 #### 二、MVEL 2.0 表达式概述 ...

    MVEL 2.doc

    解释执行适用于简单场景,而预编译执行通常用于性能敏感的应用,因为它可以生成优化过的字节码,从而提高执行效率。 ### 变量作用域 MVEL支持局部变量和全局变量。局部变量仅在当前表达式或块的范围内有效,而全局...

    mvel14-1.2.21.jar

    mvel14-1.2.21.jar mvel14-1.2.21.jar

    MVel 2.0.15 doc

    预编译模板是为了提高性能,确保快速执行。 ```java public class MVELTemplateWriter { private final CompiledTemplate template; public MVELTemplateWriter(String template) { this.template = Template...

    MVEL脚本语言语法

    很好的MVEL基础语法学习资料,希望能帮到你~

    mvel 2.0.15

    MVEL is very easy to use, and just as easy to integrate into your application. Let's take a quick look at a simple MVEL expression: foo.name == "Mr. Foo" This simple expression asks MVEL if the value...

    mvel2-2.0.18

    功能强大的基于Java应用程序的表达式语言.

    mvel2-2.3.0.Final.jar

    java运行依赖jar包

    mvel2-2.1.6.Final-javadoc.jar

    mvel2-2.1.6.Final-javadoc

    mvel2-2.1.0.drools16.jar

    mvel2-2.1.0.drools16.jar mvel2-2.1.0.drools16.jar

    Java SpEL、Ognl、MVEL2表达式Hook并记录小项目.zip

    4. 测试与优化:编写测试用例,确保Hook功能正常工作,并根据性能需求进行优化。 通过这个小项目,开发者能够深入理解这些表达式语言的工作原理,同时掌握如何在实际项目中实现监控和日志记录,从而提升代码的可...

    easyrulesplusmvel:一个结合 Easy Rules 和 MVEL 的 Java 项目

    标题 "easyrulesplusmvel:一个结合 Easy Rules 和 MVEL 的 Java 项目" 提到的是一种基于 Java 的规则引擎实现,它整合了 Easy Rules 和 MVEL 这两个库。Easy Rules 是一个简单、灵活的 Java 规则引擎,旨在简化业务...

Global site tag (gtag.js) - Google Analytics