先说结果:
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的渲染工具来生成高质量的渲染图像,以便更好地展示...
RhinoResurf的1.88版本,不仅提供了中文界面,让中国用户能够无障碍地操作,还进行了诸多性能优化和功能增强。它包含了一系列先进的曲面构建工具,如NURBS(非均匀有理B样条)建模技术,使得曲面的控制点更加灵活,...
Rhino的精度取决于模型的复杂度和精度要求。 Rhino 的精度问题 Rhino是自由造型软件,具有高精度的特点。Rhino的精度问题主要体现在以下几个方面: 1. 双精度浮点值:Rhino使用双精度浮点值来计算模型的精度。这...
【Rhino二次开发】是指利用编程语言如C++对Rhino 3D建模软件进行扩展和定制,以实现特定功能或自动化工作流程的过程。Rhino,全名Rhinoceros,是一款强大的NURBS(非均匀有理B样条)建模工具,广泛应用于工业设计、...
工作视窗是进行绘图与建模的主要区域,而物件锁点控制与状态列则帮助用户监控对象位置和方向。指令历史记录了用户的操作过程,便于学习和回顾。 教程中对于如何开始使用Rhino进行了详细的指导,包括如何浏览模型、...
Rhino缩略图查看工具是针对Rhino模型文件(通常扩展名为.3dm)而设计的一个辅助工具,旨在帮助用户更方便地预览和管理他们的3D模型文件。这个工具提供了在文件资源管理器中直接显示Rhino模型的缩略图功能,无需打开...
Rhino支持导入多种分析结果数据,并可通过插件进行更深层次的性能评估,帮助设计师优化设计方案,确保最终产品的性能达到预期目标。 #### 5. 数据交换与协同工作 为了确保整个设计团队之间信息流通顺畅,Rhino支持...
根据提供的信息,“中文版Rhino 5.0完全自学教程”这一资料主要涉及的是Rhino 5.0软件的学习与应用。尽管具体内容未给出详细章节或...希望这份指南能够帮助大家更好地掌握Rhino 5.0的使用技巧,激发更多的创意灵感。
为了更好地理解和运用Rhino Python函数,建议通过实际项目来进行练习。可以从简单的脚本开始,逐步增加复杂度,最终尝试解决实际工作中遇到的问题。 #### 加入社区 加入Rhino的用户社区是非常有帮助的。社区成员...
7. **实际应用案例**:为了更好地理解和应用这些概念,书中的实例可能涵盖Web应用程序、服务器端脚本、命令行工具等多个场景,展示Rhino在实际项目中的价值。 8. **性能优化**:由于JavaScript通常被认为是解释型...
通过深入理解和熟练掌握Rhino4.0的曲面雕刻工具,设计师可以创作出更加细腻、独特的三维模型,提高工作效率,并在创意表达上拥有更大的自由度。对于学习和使用Rhino的用户来说,这是一个不可或缺的技能。
与Rhino7的集成使得Supersweep不仅能够利用Rhino7的基础功能,还能享受到新版本带来的性能提升和优化。 自由跟随是Supersweep的一大亮点。这意味着用户可以自定义任何形状和路径,无论是直线、曲线、甚至是非均匀...
编译方式更适合于大量并发调用的场景,因为它通过预编译脚本,然后执行编译后的代码,这种方式能获得更好的性能。 脚本执行上下文具有不同的范围,包括全局范围、引擎范围和局部范围。全局上下文是指所有脚本引擎都...
**标题解析:** "Pure JS (6.1):使用 Rhino Shell 和 Debugger 运行和调试 JS" 这个标题表明我们将深入探讨如何利用Rhino Shell和JavaScript的调试工具来执行和调试纯JavaScript代码。Rhino是Mozilla开发的一个开源...
标题中的“rhino文件直接导入max_NURBS.rar”指的是将Rhino软件创建的NURBS(非均匀有理B样条)模型导入到Autodesk 3ds Max中进行处理和渲染的过程。Rhino是一款强大的建模工具,尤其在创建NURBS几何体方面表现出色...
- **社区支持**:设计师可以在Rhino和Rhinoshoe的用户论坛中交流经验,分享作品,获取帮助。 - **更新与升级**:Rhinoshoe会定期更新,添加新功能并修复问题,保持与最新版本的Rhino兼容。 总的来说,Rhinoshoe是...
扫描版"这个标题暗示了我们将深入探讨如何利用Vray为Rhino赋予更真实的光影效果和艺术表现力。 Vray是由 Chaos Group 公司开发的一款高级光线追踪和全局光照渲染器,它以其高质量的图像输出和高效的计算能力闻名于...
Rhino的jar包。 Rhino 是开源的 JavaScript 引擎,是完全基于 Java 实现,几乎可以使用 JavaScript 完成 Java 所有的工作。
- **进阶技巧**:分享一些高级技巧,如错误处理、调试等,帮助读者更好地应对复杂问题。 #### 五、视觉示例的重要性 传统的编程教程往往采用非可视化的例子,这可能会增加初学者的学习难度。而本书的一大特色在于...
Python易读的语法加上视觉例子,使得教程可以更好地帮助用户理解和编写简单的程序,以便在Rhino中自动化和设计工作。 教程中提到的编程可以提供自动化的功能、决策制定、强大的计算以及几何操作,从而成为设计师的...