为了配合一下JSEL的发布推广,做了一下性能测试。
说实在的,真不想做这类测试,太无趣了。
首先说明一下,这个表达式测试并不专业,我只是随便拿了一下我们 飞行大亨 Aviator的几个用例随便做的一个测试,吧数据记录一下,希望对大家有个参考价值:
对比的表达式系统有:
测试表达式:
-
1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71
-
-
6.7-100>39.6?5==5?4+5:6-1:!(100%3-39.0<27)?8*2-199:100%3
-
- i*pi+(d*b-199)/(1-d*pi)-(2+100-i/pi)%99==i*pi+(d*b-199)/(1-d*pi)-(2+100-i/pi)%99
-
- i*pi
-
-
1
//常量运算1
1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71
//常量运算2
6.7-100>39.6 ? 5==5? 4+5:6-1 : !(100%3-39.0<27) ? 8*2-199: 100%3
//变量+常量复合运算
i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99 ==i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99
//简单变量处理
i * pi
//简单常量处理
1
测试数据模型:
- vars.put("i",100);
- vars.put("pi",3.14f);
- vars.put("d",-3.9);
- vars.put("b",(byte)4);
- vars.put("bool",false);
vars.put("i",100);
vars.put("pi",3.14f);
vars.put("d",-3.9);
vars.put("b",(byte)4);
vars.put("bool",false);
先来一个总体效果吧:
有图有真相,给大家一个直接的效果吧(1000*1000次运算耗时图,单位为秒)

很明显,数据看不下去了,因为Ognl这个害群之马,太慢了,和别的引擎差距太明显,导致其他的差距看不出来了。
吧害群之马干掉,再看看(没删除干净,是在不好意思,MVEL也有问题,变量处理太慢了):

还是单独看看吧:
JSEL与Aviator消耗对比图

JSEL与MVEL消耗对比图

把MVEL 那个差距最大的去掉,看看其他的差距

原始测试数据
图表上看不清细节,贴一下原始数据:
- Source:1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71
- Aviator:
- value:11181.0
- time:2.660937(s)
- MVEL:
- value:11181.0
- time:0.11660712(s)
- Ognl:
- value:11181.0
- time:90.7111(s)
- JSEL:
- value:11181.0
- time:0.02078729(s)
- Source:6.7-100>39.6?5==5?4+5:6-1:!(100%3-39.0<27)?8*2-199:100%3
- Aviator:
- value:1
- time:2.1668231(s)
- MVEL:
- value:-7
- time:0.33598384(s)
- Ognl:
- value:1
- time:82.08548(s)
- JSEL:
- value:1
- time:0.020102492(s)
- Source:i*pi+(d*b-199)/(1-d*pi)-(2+100-i/pi)%99==i*pi+(d*b-199)/(1-d*pi)-(2+100-i/pi)%99
- Aviator:
- value:true
- time:6.8001246(s)
- MVEL:
- value:true
- time:115.0054(s)
- Ognl:
- value:true
- time:113.09844(s)
- JSEL:
- value:true
- time:3.3340743(s)
- Source:i*pi
- Aviator:
- value:314.0000104904175
- time:1.9424591(s)
- MVEL:
- value:314.0000104904175
- time:5.068285(s)
- Ognl:
- value:314.0000104904175
- time:46.878913(s)
- JSEL:
- value:314.0
- time:0.28054053(s)
- Source:1
- Aviator:
- value:1
- time:1.564514(s)
- MVEL:
- value:1
- time:0.11306722(s)
- Ognl:
- value:1
- time:40.87699(s)
- JSEL:
- value:1
- time:0.013243402(s)
Source:1000+100.0*99-(600-3*15)%(((68-9)-3)*2-100)+10000%7*71
Aviator:
value:11181.0
time:2.660937(s)
MVEL:
value:11181.0
time:0.11660712(s)
Ognl:
value:11181.0
time:90.7111(s)
JSEL:
value:11181.0
time:0.02078729(s)
Source:6.7-100>39.6 ? 5==5? 4+5:6-1 : !(100%3-39.0<27) ? 8*2-199: 100%3
Aviator:
value:1
time:2.1668231(s)
MVEL:
value:-7
time:0.33598384(s)
Ognl:
value:1
time:82.08548(s)
JSEL:
value:1
time:0.020102492(s)
Source:i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99 ==i * pi + (d * b - 199) / (1 - d * pi) - (2 + 100 - i / pi) % 99
Aviator:
value:true
time:6.8001246(s)
MVEL:
value:true
time:115.0054(s)
Ognl:
value:true
time:113.09844(s)
JSEL:
value:true
time:3.3340743(s)
Source:i * pi
Aviator:
value:314.0000104904175
time:1.9424591(s)
MVEL:
value:314.0000104904175
time:5.068285(s)
Ognl:
value:314.0000104904175
time:46.878913(s)
JSEL:
value:314.0
time:0.28054053(s)
Source:1
Aviator:
value:1
time:1.564514(s)
MVEL:
value:1
time:0.11306722(s)
Ognl:
value:1
time:40.87699(s)
JSEL:
value:1
time:0.013243402(s)
测试代码:
http://templatetest.googlecode.com/svn/trunk/TT/src/com/googlecode/templatetest/ELTimeTest.java
分享到:
相关推荐
Java SpEL、OGNL(Object-Graph Navigation Language)和MVEL是三种常见的表达式语言,它们在Java开发中被广泛用于动态逻辑的处理和对象属性的访问。在本项目中,我们将深入探讨这三个表达式语言的用法以及如何在...
**表达式语言(EL)与OGNL概述** 表达式语言(EL)是用于在Java应用程序中简洁地访问和操作对象属性的一种方式。它允许开发者通过简单的语法来读取和设置对象的属性,调用方法,以及执行其他面向对象的操作。在Java EE...
OGNL表达式在执行时需要一个上下文环境(Context),这个上下文环境通常是一个Map结构。在Struts2中,具体的上下文环境是`ActionContext`。`ActionContext`中的结构如下: - **request**:当前的HTTP请求。 - **...
### JS:ognl表达式详解 #### 一、OGNL表达式概述 OGNL (Object-Graph Navigation Language) 是一种强大的表达式语言,用于获取和设置 Java 对象的属性。它最初是由 John Rose 和 Luke Blanshard 开发,并被广泛...
它具备快速执行的能力,与ognl等其他流行表达式引擎相比,具有更高的性能。 #### 二、核心概念 - **EL (Expression Language)**: 表达式语言,用于求解特定表达式的值。 - **AST (Abstract Syntax Tree)**: 抽象...
**Java.lang.NoClassDefFoundError: ognl/PropertyAccessor** `NoClassDefFoundError` 是Java运行时环境中的一个错误,它通常发生在尝试执行一个已经成功编译但运行时找不到对应类定义的情况。在这种情况下,错误...
### OGNL表达式在Struts中的应用解析 #### 一、OGNL表达式简介 OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,主要用于获取和设置Java对象的属性,尤其适用于处理复杂的对象图。它最初由...
本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...
在这个文档中,我们将深入探讨EL表达式,并通过与OGNL、JSTL和STRUTS2标签的对比,进一步理解其用法。 首先,让我们关注EL表达式的语法。EL表达式通常以`#{}`包围,它允许开发者以一种声明式的方式访问和操作Java...
1. OGNL表达式解析:OGNL引擎首先解析表达式,确定要访问的对象和属性。 2. 查找PropertyAccessor:然后,它会查找适合当前对象类型的PropertyAccessor实现。 3. 获取/设置属性:通过调用PropertyAccessor的方法(如...
这个资源包包含了两个EL相关的jar包,它们可能是用于支持EL表达式解析和执行的关键库。虽然具体的jar包名称没有给出,但通常这些库可能包括Apache Tomcat或Jetty等服务器提供的标准EL实现,如`javax.el.jar`,以及...
在EL表达式中,实际上底层是使用了OGNL(Object-Graph Navigation Language)来处理对象导航和表达式的求值。OGNL是一种强大的表达式语言,可以用来获取或设置Java对象的属性,包括深层的对象属性和集合元素。例如,...
2. **上下文(Context)**:OGNL表达式执行时,会使用一个上下文对象来查找和设置值。这个上下文通常包含了当前作用域内的所有变量和对象。 3. **值栈(Value Stack)**:在Struts 2框架中,OGNL默认使用值栈来处理...
10. **OGNL与拦截器**:Struts2的拦截器机制允许在执行Action之前或之后对数据进行处理,而OGNL则可以用来设置或读取这些数据。 总的来说,了解并熟练掌握OGNL是深入理解Struts2框架的关键。通过使用OGNL,开发者...
在Struts2框架中,OGNL(Object-Graph Navigation Language)和EL(Expression Language)都是用于数据绑定和表达式处理的重要工具,它们在处理视图层与模型层的数据交互方面发挥着关键作用。理解这两者的差异有助于...
但是,由于OGNL允许任意的Java代码执行,不恰当的使用可能会引发安全问题,如著名的Struts2 OGNL注入漏洞。因此,在使用OGNL时,必须确保输入的数据已经过适当的验证和过滤。 总的来说,这个案例将帮助我们理解如何...
Struts2是一个流行的Java Web...通过深入学习OGNL表达式原理,开发者能够更好地利用Struts2框架,提高Web应用的开发效率和可维护性。对于那些希望在Struts2开发中更进一步的人来说,熟悉和掌握OGNL是必不可少的技能。
struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用
OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,用于获取和设置Java对象的属性。...通过深入学习和实践,开发者能够有效地利用OGNL进行数据绑定和表达式计算,提升代码的可读性和效率。