`

OGNL & MVEL &java调用 性能误解

阅读更多

一、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倍左右的差距。

 

0
0
分享到:
评论

相关推荐

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

    Java SpEL、OGNL(Object-Graph Navigation Language)和MVEL是三种常见的表达式语言,它们在Java开发中被广泛用于动态逻辑的处理和对象属性的访问。在本项目中,我们将深入探讨这三个表达式语言的用法以及如何在...

    ognl表达式java使用案例详解(测试通过)

    本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...

    struts2.0中的ognl

    Struts2.0是Apache软件基金会的一个开源项目,它是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架。在Struts2中,OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取...

    ognl.jar资源包

    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-2.7.3-src

    OGNL 是一个用于 Java 应用程序的通用表达式语言,它支持动态计算对象属性和方法调用。OGNL 提供了对 Java 对象图的导航能力,使得你可以通过简单的字符串表达式来访问和修改对象的属性,甚至可以执行复杂的逻辑...

    ognl-3.2.21-API文档-中文版.zip

    标签:ognl、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    使用的ognl的chm

    **OGNL(Object-Graph Navigation Language)**是一种强大的表达式语言,主要用于获取和设置Java对象的属性。在Java开发中,尤其是Web应用框架如Struts2和Hibernate中,OGNL被广泛使用。它允许开发者以简洁的方式...

    ognl的jar包

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它是Apache Struts2框架的核心组成部分,也被许多其他Java应用和框架广泛使用,如Spring WebFlow。在Java世界中,...

    ognl2.6.11 源代码

    5. **查看OGNL与Java反射API的交互**:OGNL利用反射API来动态调用对象的方法和访问属性,这对于学习Java反射和动态类型编程很有价值。 6. **理解OGNL与各种框架的集成**:虽然OGNL是一个独立的库,但它常与其他框架...

    ognl项目文件和源代码

    2. **Compiler**: 将AST编译成Java字节码,以提高性能。 3. **Runtime**: 包含了OGNL表达式的执行逻辑,如上下文管理、类型转换、属性访问等。 **学习资源** 要充分利用这个项目文件,你可以: - 在Eclipse中导入...

    ognl源码.rar

    2. **自省(Introspection)**:通过Java反射API,OGNL能动态查找和调用对象的方法,以及读写属性。 3. **列表和映射访问**:支持数组、列表、集合和映射的直接访问,例如`list[0]`或`map['key']`。 4. **方法调用...

    ognl源代码(可以省去不少麻烦)

    **OGNL(Object-Graph Navigation Language)源代码...深入研究OGNL的源代码,不仅能提升对OGNL的理解,还能增强对Java反射、表达式语言设计以及性能优化等方面的认识。对于Java开发者来说,这是一份宝贵的学习资源。

    ognl源码

    ognl(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它在Java社区中广泛应用于Web应用开发,尤其是在Struts2框架中,作为视图层与模型层交互的主要工具。2008年07月29...

    ognl-2.6.9-doc.zip

    OGNL是一种强大的表达式语言,广泛用于Java应用程序,特别是Spring框架中,用于在运行时访问和操作对象图。 **1. OGNL简介** OGNL是一种轻量级的脚本语言,它允许开发者以简洁的语法来表达复杂的对象导航和操作。它...

    OGNL jar包及源码

    OGNL (Object-Graph Navigation Language) 是一种强大的表达式语言,用于获取和设置Java对象的属性。它在Java开发中广泛应用于数据绑定和表达式计算,尤其在Web框架如Struts 1和2中扮演着核心角色。这个压缩包包含了...

    ognl表达式 ognl表达式

    OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。它是Struts2框架中的默认表达式语言,同时也被广泛应用于其他Java环境中。OGNL支持丰富的语法特性,能够方便地...

    OGNL教程,简单,看完懂OGNL语言

    OGNL,全称Object-Graph Navigation Language,是一种强大的表达式语言,主要用来获取和设置Java对象的属性。它的设计初衷是解决UI组件和控制器之间的数据绑定问题,使得视图和控制器之间的交互更为简便。随着时间的...

    OGNL表达式的使用及文档

    4. **方法调用**:OGNL允许直接在表达式中调用方法,如`user.getEmail()`。 5. **运算符支持**:OGNL支持常规的算术、比较和逻辑运算符,如`+`, `-`, `*`, `/`, `%`, `&gt;`, `, `==`, `&&`, `||`等。 二、OGNL进阶...

Global site tag (gtag.js) - Google Analytics