java fel_Java表达式引擎fel/groovy/expression4j/java脚本引擎的性能对比【原创】
又是性能对比,最近跟性能较上劲了。
产品中需要用到数学表达式,表达式不复杂,但是对性能要求比较高。选用了一些常用的表达式引擎计算方案,包含:java脚本引擎(javax/script)、groovy脚本引擎、Expression4j、Fel表达式引擎。
其中java脚本引擎使用了解释执行和编译执行两种方式、groovy脚本只采用了编译执行(解释执行太慢)、Fel采用了静态参数和动态参数两种方式。以下为测试代码:public class ExpressionTest extends BaseTest {
private int count = 100000;
//javax的编译执行,效率比解释执行略高?为什么才略高??
@Test
public void testCompiledJsScript() throws Throwable {
javax.script.ScriptEngine se = new ScriptEngineManager().getEngineByName("js");
Compilable ce = (Compilable) se;
CompiledScript cs = ce.compile("a*b*c");
Bindings bindings = se.createBindings();
bindings.put("a", 3600);
bindings.put("b", 14);
bindings.put("c", 4);
long start = System.currentTimeMillis();
for (int i = 0; i
cs.eval(bindings);
}
System.out.println(System.currentTimeMillis() - start);
}
//javax script解释执行
@Test
public void testJsScript() throws Throwable {
javax.script.ScriptEngine se = new ScriptEngineManager().getEngineByName("js");
Bindings bindings = se.createBindings();
bindings.put("a", 3600);
bindings.put("b", 14);
bindings.put("c", 4);
long start = System.currentTimeMillis();
for (int i = 0; i
se.eval("a*b*c", bindings);
}
System.out.println(System.currentTimeMillis() - start);
}
//groovy的编译执行
@Test
public void testGroovy() {
//这里的ScriptEngine和GroovyScriptEngine是自己编写的类,不是原生的
ScriptEngine se = this.getBean(GroovyScriptEngine.class);
Map paramMap = new HashMap();
paramMap.put("param", 5);
//ScriptEngine首次执行会缓存编译后的脚本,这里故意先执行一次便于缓存
se.eval("3600*34*param", paramMap);
long start = System.currentTimeMillis();
for (int i = 0; i
se.eval("3600*34*param", paramMap);
}
System.out.println(System.currentTimeMillis() - start);
}
//Expression4J的表达式引擎,这里是通过函数的方式,有点特别
@Test
public void testExpression4j() throws Throwable {
Expression expression = ExpressionFactory.createExpression("f(a,b,c)=a*b*c");
System.out.println("Expression name: " + expression.getName());
System.out.println("Expression parameters: " + expression.getParameters());
MathematicalElement element_a = NumberFactory.createReal(3600);
MathematicalElement element_b = NumberFactory.createReal(34);
MathematicalElement element_c = NumberFactory.createReal(5);
Parameters parameters = ExpressionFactory.createParameters();
parameters.addParameter("a", element_a);
parameters.addParameter("b", element_b);
parameters.addParameter("c", element_c);
long start = System.currentTimeMillis();
for (int i = 0; i
expression.evaluate(parameters);
}
System.out.println(System.currentTimeMillis() - start);
}
//fel的表达式引擎(静态参数,同上面)
@Test
public void felTest() {
FelEngine e = FelEngine.instance;
final FelContext ctx = e.getContext();
ctx.set("a", 3600);
ctx.set("b", 14);
ctx.set("c", 5);
com.greenpineyu.fel.Expression exp = e.compile("a*b*c", ctx);
long start = System.currentTimeMillis();
Object eval = null;
for (int i = 0; i
eval = exp.eval(ctx);
}
System.out.println(System.currentTimeMillis() - start);
System.out.println(eval);
}
//fel表达式引擎(动态参数,这里动态参数的产生和变量改变都会消耗时间,因此这个测试时间不准确,只是验证对于动态参数的支持)
@Test
public void felDynaTest() {
FelEngine e = FelEngine.instance;
final FelContext ctx = e.getContext();
ctx.set("a", 3600);
ctx.set("b", 14);
ctx.set("c", 5);
com.greenpineyu.fel.Expression exp = e.compile("a*b*c", ctx);
long start = System.currentTimeMillis();
Object eval = null;
Random r = new Random();
for (int i = 0; i
ctx.set("a", r.nextInt(10000));
ctx.set("b", r.nextInt(100));
ctx.set("c", r.nextInt(100));
eval = exp.eval(ctx);
}
System.out.println(System.currentTimeMillis() - start);
System.out.println(eval);
}
public static void main(String[] args) throws Throwable {
ExpressionTest et = new ExpressionTest();
//执行100W次的测试
et.count = 1000000;
et.testCompiledJsScript();
et.testJsScript();
et.testExpression4j();
et.testGroovy();
et.felTest();
}
}
测试结果如下:表达式引擎执行时间(毫秒)备注
java脚本引擎编译后执行7662
java脚本引擎解释执行10609
expression4j578
groovy编译执行224
fel静态参数19
fel动态参数107该项测试比较不公平,随机数的产生以及参数的变更也会占用一定时间,测试目的只是为了验证是不是存在静态优化,从而导致静态性能远高于动态性能的情况。
结论:
从以上性能对比来看(抛开表达式的功能),fel明显占据很大优势,groovy和expression4j也是可以接受的。java脚本引擎的执行偏慢。因此,对于表达式不是很复杂性能要求高的情况下,推荐使用fel或者groovy编译执行的方式。
java fel_Java表达式引擎fel/groovy/expression4j/java脚本引擎的性能对比【原创】相关推荐
- Java版AVG游戏开发入门示例 3 ——脚本引擎的制作及应用
源码下载地址:http://code.google.com/p/loon-simple/downloads/list 根据wikipedia的解释:脚本语言(Script language,scrip ...
- Java版AVG游戏开发入门示例[3]——脚本引擎的制作及应用
源码下载地址:http://code.google.com/p/loon-simple/downloads/list 根据wikipedia的解释:脚本语言(Script language,scrip ...
- .NET简谈脚本引擎系列(一:认识脚本引擎)
提到脚本,大家都耳熟能详但是默默无私奉献的脚本引擎都被大家所忽略,本人也是最近才开始接触脚本引擎的技术的,是我的恩师指点我去学习它, 真是不用不不知道,一用吓一跳:如果我们能熟练的使用脚本引擎,那么将 ...
- 一个5节点的polardb mysql_POLARDB云数据库分布式存储引擎揭秘,POLARDB和MySql 5.6兼容性能对比...
2017云栖大会POLARDB专场,阿里云资深技术专家曹伟带来POLARDB云数据库分布式存储引擎揭秘的演讲.本文主要从计算和存储分离的优势谈起,然后说明控制平面与数据平面分离,接着分享了划时代的技术 ...
- 【Java脚本引擎】脚本引擎执行JavaScript代码
应用场景 公司有30员工,每个人工资计算方式不同.现在需要计算工资. 传统的方法:一个接口,30个实现类. 使用脚本引擎:编写一个xml文件,每人一个计算公式,使用的时候可以把公式加载到程序中,启动时 ...
- Lambda表达式的生动理解以及Java Lambda表达式常见使用场景
本篇承接上一篇 Java Lambda 表达式快速学习 , 对Lambda 表达式的语法格式进行演化说明, 并对Java 中Lambda表达式的常见使用场景进行说明. Lambda 表达式怎么来的? ...
- java lambda表达式 steam api
java lambda表达式 steam api 案例使用 java版本为 jdk-17 foreach 遍历 public class JavaDemo03 {public static void ...
- 复杂多变场景下的Groovy脚本引擎实战
作者:vivo互联网服务器团队-Gao Xiang 一.前言 因为之前在项目中使用了Groovy对业务能力进行一些扩展,效果比较好,所以简单记录分享一下,这里你可以了解: 为什么选用Groovy作为脚 ...
- java script eval_java ScriptEngine 使用 (支持JavaScript脚本,eval()函数等)
Java SE 6最引人注目的新功能之一就是内嵌了脚本支持.在默认情况下,Java SE 6只支持JavaScript,但这并不以为着Java SE 6只能支持JavaScript.在Java SE ...
最新文章
- 使用 qrcodejs 生成二维码的几个问题
- Python中read( )与readlines( )的使用
- 【机器视觉】 assign_at算子
- 如何实现文字在图片中间的效果
- android 环信消息红点,环信3.0获取会话消息列表
- Java数组参考_Java数组
- Linux命令之 -- export 设置/显示系统环境变量
- ISAPI Rewrite 2 规则中文版
- 如何安装PANABIT?
- 连接池实现mysql增删改查_java使用原生MySQL实现数据的增删改查以及数据库连接池技术...
- 回溯法——利用解空间树解决0-1背包问题
- django如何连接Mysql中已有的数据库
- 教师计算机课教学反思范文,信息技术课优秀教学反思
- 计算机视觉中的多视图几何<Part0—基础知识:射影几何、变换和估计>(3)
- 王者荣耀官网全皮肤超超超清原皮爬取!!!
- 【前端小实战】遮罩层动画效果
- 我的世界java版多核优化_Minecraft 我的世界服务器优化教程 —— 让多带50%的玩家不再是梦...
- HDU 1713 相遇周期【这也算数学吗?】
- SSH Secure提示:Server responded Protocol error:packet too long
- 教你两分钟做出一个精美好用的404页面
热门文章
- UE4 时间膨胀,慢动作(蓝图)
- 苹果计算机怎么返回上一步操作,iphone12怎么关闭程序-iphone12怎么返回上一步
- 中国汽车协会:我国整车出口数量达到43.8万辆,同比增长92.8%
- 能量项链【区间dp】
- Android对emoji表情的处理(二)
- 博客园主页样式修改(加透明背景和微调位置)
- Android 查看图片的位置信息
- RTL8192系列RL-UM02B-8192EU双通道USB接口WiFi模块选型参考
- (数据结构)[python](11)----链表与栈
- 基于prometheus的监控管理平台