一、OGNL & MVEL
关于OGNL的使用参见: http://www.ibm.com/developerworks/cn/opensource/os-cn-ognl/
关于MVEL的使用参见:http://mvel.codehaus.org/Getting+Started+for+2.0
二、性能
关于OGNL&MVEL两者的性能一开始看到 http://mvel.codehaus.org/Performance+of+MVEL+2.0 等等一系列的 测试报告的时候几乎都要相信的放弃OGNL了
并且在第一篇文章中也有OGNL和java原始调用的对比,实际测试也发现大有不同。
然后实际测试结果发现最使用新版本,都做最优化的时候两者均相差不大。当然在都不做预编译的时候MVEL 确实好于OGNL
直接上代码:
//direct invoke long time01 = new Date().getTime(); String dirResult=""; for (int i = 0; i < 100000; i++) { dirResult= person.getDog().getName(); } long time02 = new Date().getTime(); System.out.println("direct invoke :"+(time02 - time01)); //MVEL invoke long time1 = new Date().getTime(); for (int i = 0; i < 100000; i++) { MVEL.eval("p.dog.name", varMap); } long time2 = new Date().getTime(); System.out.println("mvel invoke:"+(time2 - time1)); //MVEL compiled invoke OptimizerFactory.setDefaultOptimizer("ASM"); ExecutableAccessor compiled2 = (ExecutableAccessor) MVEL.compileExpression("p.dog.name"); long time3 = new Date().getTime(); for (int i = 0; i < 100000; i++) { String name = (String) MVEL.executeExpression(compiled2, varMap); } long time4 = new Date().getTime(); System.out.println("mv compiled invoke:" + (time4 - time3)); //OGNL invoke long time6 = new Date().getTime(); for (int i = 0; i < 100000; i++) { Ognl.getValue("#person.dog.name", context, context.getRoot()); } long time7 = new Date().getTime(); System.out.println("ognl invoke:" + (time7 - time6)); //OGNL compile invoke OgnlContext context2 = new OgnlContext();// 实现了map接口 context.setRoot(person); Node node = Ognl.compileExpression(context2, context2.getRoot(), "dog.name"); context2.putAll(context); long time8 = new Date().getTime(); for (int i = 0; i < 100000; i++) { node.getAccessor().get(context, context.getRoot()); } long time9 = new Date().getTime(); System.out.println("ognl compile invoke:" + (time9 - time8)); //OGNL compile invoke long time18 = new Date().getTime(); for (int i = 0; i < 100000; i++) { Ognl.getValue(node, context, context.getRoot()); } long time19 = new Date().getTime(); System.out.println("ognl compile invoke 2:" + (time19 - time18)); //OGNL parse invoke Object expre = Ognl.parseExpression("#person.dog.name"); long time10 = new Date().getTime(); for (int i = 0; i < 100000; i++) { Ognl.getValue(expre, context, context.getRoot()); node.getAccessor().get(context, context.getRoot()); } long time11 = new Date().getTime(); System.out.println("ognl parse invoke:" + (time11 - time10));
结果如下:
direct invoke :5 mvel invoke:672 mv compiled invoke:74 ognl invoke:2402 ognl compile invoke:88 ognl compile invoke 2:88 ognl parse invoke:178
版本信息:
OGNL:3.0.1
MVEL:2.2.0
JDK:1.7.0_55
三、结论:
1、都进行预编译的时候 OGNL& MVEL 性能相差不大。
2、默认直接使用 MVEL 优于 OGNL。
3、相比java执行调用还是20倍左右的差距。
相关推荐
Java SpEL、OGNL(Object-Graph Navigation Language)和MVEL是三种常见的表达式语言,它们在Java开发中被广泛用于动态逻辑的处理和对象属性的访问。在本项目中,我们将深入探讨这三个表达式语言的用法以及如何在...
本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...
Struts2.0是Apache软件基金会的一个开源项目,它是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架。在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取...
camel-ognl-1.6.4.jar, camel-ognl-2.8.1.jar, com.springsource.org.ognl-2.6.9.jar, com.springsource.org.ognl-sources-2.6.9.jar, ognl-2.5.1.jar, ognl-2.6.11.jar, ognl-2.6.3.jar, ognl-2.6.5.jar, ognl-...
OGNL 是一个用于 Java 应用程序的通用表达式语言,它支持动态计算对象属性和方法调用。OGNL 提供了对 Java 对象图的导航能力,使得你可以通过简单的字符串表达式来访问和修改对象的属性,甚至可以执行复杂的逻辑...
标签:ognl、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
**OGNL(Object-Graph Navigation Language)**是一种强大的表达式语言,主要用于获取和设置Java对象的属性。在Java开发中,尤其是Web应用框架如Struts2和Hibernate中,OGNL被广泛使用。它允许开发者以简洁的方式...
OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它是Apache Struts2框架的核心组成部分,也被许多其他Java应用和框架广泛使用,如Spring WebFlow。在Java世界中,...
5. **查看OGNL与Java反射API的交互**:OGNL利用反射API来动态调用对象的方法和访问属性,这对于学习Java反射和动态类型编程很有价值。 6. **理解OGNL与各种框架的集成**:虽然OGNL是一个独立的库,但它常与其他框架...
2. **Compiler**: 将AST编译成Java字节码,以提高性能。 3. **Runtime**: 包含了OGNL表达式的执行逻辑,如上下文管理、类型转换、属性访问等。 **学习资源** 要充分利用这个项目文件,你可以: - 在Eclipse中导入...
2. **自省(Introspection)**:通过Java反射API,OGNL能动态查找和调用对象的方法,以及读写属性。 3. **列表和映射访问**:支持数组、列表、集合和映射的直接访问,例如`list[0]`或`map['key']`。 4. **方法调用...
**OGNL(Object-Graph Navigation Language)源代码...深入研究OGNL的源代码,不仅能提升对OGNL的理解,还能增强对Java反射、表达式语言设计以及性能优化等方面的认识。对于Java开发者来说,这是一份宝贵的学习资源。
ognl(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它在Java社区中广泛应用于Web应用开发,尤其是在Struts2框架中,作为视图层与模型层交互的主要工具。2008年07月29...
OGNL是一种强大的表达式语言,广泛用于Java应用程序,特别是Spring框架中,用于在运行时访问和操作对象图。 **1. OGNL简介** OGNL是一种轻量级的脚本语言,它允许开发者以简洁的语法来表达复杂的对象导航和操作。它...
OGNL (Object-Graph Navigation Language) 是一种强大的表达式语言,用于获取和设置Java对象的属性。它在Java开发中广泛应用于数据绑定和表达式计算,尤其在Web框架如Struts 1和2中扮演着核心角色。这个压缩包包含了...
OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它是Struts2框架中的默认表达式语言,同时也被广泛应用于其他Java环境中。OGNL支持丰富的语法特性,能够方便地...
OGNL,全称Object-Graph Navigation Language,是一种强大的表达式语言,主要用来获取和设置Java对象的属性。它的设计初衷是解决UI组件和控制器之间的数据绑定问题,使得视图和控制器之间的交互更为简便。随着时间的...
4. **方法调用**:OGNL允许直接在表达式中调用方法,如`user.getEmail()`。 5. **运算符支持**:OGNL支持常规的算术、比较和逻辑运算符,如`+`, `-`, `*`, `/`, `%`, `>`, `, `==`, `&&`, `||`等。 二、OGNL进阶...