首页   快速返回

groovy与mvel比较     所属分类 java
动态脚本 表达式引擎
常用于规则引擎 


mvel 使用更简单 
mvel编译出来的对象 无状态 , groovy编译出来的对象有状态
groovy  对字符串内的  $xxx 会做变量解析  , 与shell类似  ,该功能多余 ,字符串中包含$ 需要转义 
mvel 不会做变量解析
groovy 把 数字类型 参数设置成 string  报错 , mvel可兼容
groovy 参数使用 Binding 对象 , mvel 使用 map ,更通用

jar包大小
groovy-2.5.6.jar	   5466446  5M
mvel2-2.2.0.Final.jar  1013700  1M

groovy的非编译版本 性能非常渣  而且方法区容易爆  不建议使用


性能对比

不编译和编译 性能差异较大 ,只比较编译后执行的情况





          // mvel compile

         Serializable compiledExpression = null;
	 // 表达式编译
	 compiledExpression = MVEL.compileExpression(expression);			
		
          long start = System.currentTimeMillis();
          for(int j=0;j<loop2;j++){
            MVEL.executeExpression(compiledExpression, params);
          }
          end = System.currentTimeMillis();
          mvelCompileRunTime = end - start;
          System.out.println(mvelCompileRunTime);
    
         
          // groovy compile   

          GroovyClassLoader loader = null;	
	  loader = new GroovyClassLoader();
          Class groovyClass = loader.parseClass(expression);	
	  System.out.println("groovyClass="+groovyClass);

          GroovyObject groovyObject = null;
          final Object[] args = new Object[]{};      
          start = System.currentTimeMillis();
          for(int j=0;j<loop2;j++){
            groovyObject = (GroovyObject) groovyClass.newInstance();  
            // groovyObject 不可缓存  
            groovyObject.setProperty("a", 1);
            groovyObject.setProperty("b", 2);
            groovyObject.setProperty("c", 3);  
            groovyObject.invokeMethod("run", args);    
          }
          end = System.currentTimeMillis();
          groovyCompileRunTime = end - start;
          System.out.println(groovyCompileRunTime);

          

代码看起来 groovy更复杂 ,但是执行起来 groovy 反而更快        


性能测试完整代码
https://gitee.com/dyyx/mveldemo/blob/master/src/main/java/dyyx/PerfTest.java

上一篇     下一篇
java日志打印建议

groovy与java的一些区别

groovy简介

常用硬件性能参数

System.getenv 与 System.getProperty 的区别

logback.xml变量取不到值问题