`

mvel和Rhino的性能对比 结果是Rhino性能更好点

 
阅读更多
先说结果:
mvel  1000000次 ===>2950毫秒 100000次 ===>627毫秒
Rhino 1000000次 ===>1889毫秒 100000次 ===>494毫秒
测试代码如下:我用了还算是项目中稍微复杂点的表达式



mvel的性能测试


package com.eyu.ahxy.module.expression;

import java.io.Serializable;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;

import org.junit.Test;
import org.mvel2.MVEL;
import org.mvel2.ParserContext;

/**
 *  1000000次 ===>2950毫秒 100000次 ===>627毫秒
 * @author bean
 */
public class ComplexMvelTest {

	public int getA() {
		return 10;
	}

	public int getB() {
		return 10;
	}

	private static final ParserContext context = new ParserContext();
	static {
		/** 导入 {@link Math} 中的全部静态方法 */
		context.addImport(Math.class);
		for (Method method : Math.class.getMethods()) {
			int mod = method.getModifiers();
			if (Modifier.isStatic(mod) && Modifier.isPublic(mod)) {
				String name = method.getName();
				context.addImport(name, method);
			}
		}
	}

	public static final int NUM = 1000000;

	public static String exp = "min(floor(test.a*test.getB()),floor(c+d*e))";
	public static Map<String, Object> map = new HashMap<>();

	static {
		map.put("test", new ComplexMvelTest());
		map.put("c", 10);
		map.put("d", 10);
		map.put("e", 2);
	}

	final Serializable exp2 = MVEL.compileExpression(exp, context);

	// @Test
	public void notCompileTest() {
		for (int i = 0; i < NUM; i++) {
			MVEL.eval(exp, map, Double.class);
		}
	}

	@Test
	public void compileTest() {
		for (int i = 0; i < NUM; i++) {
			Object result = MVEL.executeExpression(exp2, map, Double.class);
//			System.err.println(result);
		}
	}

}




Rhino的性能测试


package com.eyu.ahxy.module.expression;

import org.junit.Test;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.Script;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;

/**
 *  1000000次 ===>1889毫秒 100000次 ===>494毫秒
 * @author bean
 */
public class RhinoComplexCompileTest2 {
	public static final int NUM = 1000000;

	public int getA() {
		return 10;
	}
	
	public int getB() {
		return 10;
	}

	public static String exp = "min(floor(test.a*test.getB()),floor(c+d*e))";
	static Context cx = Context.enter();
	Script exp2 =cx.compileString(exp, "tt", 1, null);
	
	
	static Scriptable scope = cx.initStandardObjects();
	{
		ScriptableObject.putProperty(scope, "c", 10);
		ScriptableObject.putProperty(scope, "d", 10);
		ScriptableObject.putProperty(scope, "e", 2);
		ScriptableObject.putProperty(scope, "test", this);
		
		cx.evaluateString(scope, "function min(a,b){return java.lang.Math.min(a,b)}", null, 1, null); 
		cx.evaluateString(scope, "function floor(a){return java.lang.Math.floor(a)}", null, 1, null); 
	}

	@Test
	public void name() {
		for (int i = 0; i < NUM; i++) {
			Object result=exp2.exec(cx, scope);
//			System.err.println(cx.toString(result));
		}
	}

}

分享到:
评论

相关推荐

    Rhino(犀牛)中文教程

    用户也可以使用Rhino的分析工具来分析模型的曲率、方向、距离等信息,从而更好地了解模型的结构和性能。 此外,Rhino还提供了强大的渲染功能,用户可以使用Rhino的渲染工具来生成高质量的渲染图像,以便更好地展示...

    RhinoResurf

    RhinoResurf的1.88版本,不仅提供了中文界面,让中国用户能够无障碍地操作,还进行了诸多性能优化和功能增强。它包含了一系列先进的曲面构建工具,如NURBS(非均匀有理B样条)建模技术,使得曲面的控制点更加灵活,...

    Rhino转换Catia文件

    Rhino的精度取决于模型的复杂度和精度要求。 Rhino 的精度问题 Rhino是自由造型软件,具有高精度的特点。Rhino的精度问题主要体现在以下几个方面: 1. 双精度浮点值:Rhino使用双精度浮点值来计算模型的精度。这...

    rhino二次开发学习资料

    【Rhino二次开发】是指利用编程语言如C++对Rhino 3D建模软件进行扩展和定制,以实现特定功能或自动化工作流程的过程。Rhino,全名Rhinoceros,是一款强大的NURBS(非均匀有理B样条)建模工具,广泛应用于工业设计、...

    Rhino 6 中文教程.pdf

    工作视窗是进行绘图与建模的主要区域,而物件锁点控制与状态列则帮助用户监控对象位置和方向。指令历史记录了用户的操作过程,便于学习和回顾。 教程中对于如何开始使用Rhino进行了详细的指导,包括如何浏览模型、...

    rhino缩略图查看工具

    Rhino缩略图查看工具是针对Rhino模型文件(通常扩展名为.3dm)而设计的一个辅助工具,旨在帮助用户更方便地预览和管理他们的3D模型文件。这个工具提供了在文件资源管理器中直接显示Rhino模型的缩略图功能,无需打开...

    Rhino 3D工业级造型与设计.pdf

    Rhino支持导入多种分析结果数据,并可通过插件进行更深层次的性能评估,帮助设计师优化设计方案,确保最终产品的性能达到预期目标。 #### 5. 数据交换与协同工作 为了确保整个设计团队之间信息流通顺畅,Rhino支持...

    中文版rhino 5.0完全自学教程.pdf

    根据提供的信息,“中文版Rhino 5.0完全自学教程”这一资料主要涉及的是Rhino 5.0软件的学习与应用。尽管具体内容未给出详细章节或...希望这份指南能够帮助大家更好地掌握Rhino 5.0的使用技巧,激发更多的创意灵感。

    rhino python函数中文网址.txt

    为了更好地理解和运用Rhino Python函数,建议通过实际项目来进行练习。可以从简单的脚本开始,逐步增加复杂度,最终尝试解决实际工作中遇到的问题。 #### 加入社区 加入Rhino的用户社区是非常有帮助的。社区成员...

    深入浅出Rhino:Java与JS互操作

    7. **实际应用案例**:为了更好地理解和应用这些概念,书中的实例可能涵盖Web应用程序、服务器端脚本、命令行工具等多个场景,展示Rhino在实际项目中的价值。 8. **性能优化**:由于JavaScript通常被认为是解释型...

    Rhino4.0曲面雕刻工具

    通过深入理解和熟练掌握Rhino4.0的曲面雕刻工具,设计师可以创作出更加细腻、独特的三维模型,提高工作效率,并在创意表达上拥有更大的自由度。对于学习和使用Rhino的用户来说,这是一个不可或缺的技能。

    rhino 路径跟随插件(supersweep/rhino7)

    与Rhino7的集成使得Supersweep不仅能够利用Rhino7的基础功能,还能享受到新版本带来的性能提升和优化。 自由跟随是Supersweep的一大亮点。这意味着用户可以自定义任何形状和路径,无论是直线、曲线、甚至是非均匀...

    Rhino脚本引擎技术介绍

    编译方式更适合于大量并发调用的场景,因为它通过预编译脚本,然后执行编译后的代码,这种方式能获得更好的性能。 脚本执行上下文具有不同的范围,包括全局范围、引擎范围和局部范围。全局上下文是指所有脚本引擎都...

    Pure JS (6.1):使用 Rhino Shell 和 Debugger 运行和调试 JS

    **标题解析:** "Pure JS (6.1):使用 Rhino Shell 和 Debugger 运行和调试 JS" 这个标题表明我们将深入探讨如何利用Rhino Shell和JavaScript的调试工具来执行和调试纯JavaScript代码。Rhino是Mozilla开发的一个开源...

    rhino文件直接导入max_NURBS.rar )

    标题中的“rhino文件直接导入max_NURBS.rar”指的是将Rhino软件创建的NURBS(非均匀有理B样条)模型导入到Autodesk 3ds Max中进行处理和渲染的过程。Rhino是一款强大的建模工具,尤其在创建NURBS几何体方面表现出色...

    rhino做鞋插件

    - **社区支持**:设计师可以在Rhino和Rhinoshoe的用户论坛中交流经验,分享作品,获取帮助。 - **更新与升级**:Rhinoshoe会定期更新,添加新功能并修复问题,保持与最新版本的Rhino兼容。 总的来说,Rhinoshoe是...

    Vray你的Rhino

    扫描版"这个标题暗示了我们将深入探讨如何利用Vray为Rhino赋予更真实的光影效果和艺术表现力。 Vray是由 Chaos Group 公司开发的一款高级光线追踪和全局光照渲染器,它以其高质量的图像输出和高效的计算能力闻名于...

    rhino-1.7.7.1.jar(Rhino for java)

    Rhino的jar包。 Rhino 是开源的 JavaScript 引擎,是完全基于 Java 实现,几乎可以使用 JavaScript 完成 Java 所有的工作。

    rhino.python 教程 (英文)

    - **进阶技巧**:分享一些高级技巧,如错误处理、调试等,帮助读者更好地应对复杂问题。 #### 五、视觉示例的重要性 传统的编程教程往往采用非可视化的例子,这可能会增加初学者的学习难度。而本书的一大特色在于...

    python for rhino教程

    Python易读的语法加上视觉例子,使得教程可以更好地帮助用户理解和编写简单的程序,以便在Rhino中自动化和设计工作。 教程中提到的编程可以提供自动化的功能、决策制定、强大的计算以及几何操作,从而成为设计师的...

Global site tag (gtag.js) - Google Analytics