又是性能对比,最近跟性能较上劲了。

产品中需要用到数学表达式,表达式不复杂,但是对性能要求比较高。选用了一些常用的表达式引擎计算方案,包含: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脚本引擎的性能对比【原创】相关推荐

  1. Java版AVG游戏开发入门示例 3 ——脚本引擎的制作及应用

    源码下载地址:http://code.google.com/p/loon-simple/downloads/list 根据wikipedia的解释:脚本语言(Script language,scrip ...

  2. Java版AVG游戏开发入门示例[3]——脚本引擎的制作及应用

    源码下载地址:http://code.google.com/p/loon-simple/downloads/list 根据wikipedia的解释:脚本语言(Script language,scrip ...

  3. .NET简谈脚本引擎系列(一:认识脚本引擎)

    提到脚本,大家都耳熟能详但是默默无私奉献的脚本引擎都被大家所忽略,本人也是最近才开始接触脚本引擎的技术的,是我的恩师指点我去学习它, 真是不用不不知道,一用吓一跳:如果我们能熟练的使用脚本引擎,那么将 ...

  4. 一个5节点的polardb mysql_POLARDB云数据库分布式存储引擎揭秘,POLARDB和MySql 5.6兼容性能对比...

    2017云栖大会POLARDB专场,阿里云资深技术专家曹伟带来POLARDB云数据库分布式存储引擎揭秘的演讲.本文主要从计算和存储分离的优势谈起,然后说明控制平面与数据平面分离,接着分享了划时代的技术 ...

  5. 【Java脚本引擎】脚本引擎执行JavaScript代码

    应用场景 公司有30员工,每个人工资计算方式不同.现在需要计算工资. 传统的方法:一个接口,30个实现类. 使用脚本引擎:编写一个xml文件,每人一个计算公式,使用的时候可以把公式加载到程序中,启动时 ...

  6. Lambda表达式的生动理解以及Java Lambda表达式常见使用场景

    本篇承接上一篇 Java Lambda 表达式快速学习 , 对Lambda 表达式的语法格式进行演化说明, 并对Java 中Lambda表达式的常见使用场景进行说明. Lambda 表达式怎么来的? ...

  7. java lambda表达式 steam api

    java lambda表达式 steam api 案例使用 java版本为 jdk-17 foreach 遍历 public class JavaDemo03 {public static void ...

  8. 复杂多变场景下的Groovy脚本引擎实战

    作者:vivo互联网服务器团队-Gao Xiang 一.前言 因为之前在项目中使用了Groovy对业务能力进行一些扩展,效果比较好,所以简单记录分享一下,这里你可以了解: 为什么选用Groovy作为脚 ...

  9. java script eval_java ScriptEngine 使用 (支持JavaScript脚本,eval()函数等)

    Java SE 6最引人注目的新功能之一就是内嵌了脚本支持.在默认情况下,Java SE 6只支持JavaScript,但这并不以为着Java SE 6只能支持JavaScript.在Java SE ...

最新文章

  1. 使用 qrcodejs 生成二维码的几个问题
  2. Python中read( )与readlines( )的使用
  3. 【机器视觉】 assign_at算子
  4. 如何实现文字在图片中间的效果
  5. android 环信消息红点,环信3.0获取会话消息列表
  6. Java数组参考_Java数组
  7. Linux命令之 -- export 设置/显示系统环境变量
  8. ISAPI Rewrite 2 规则中文版
  9. 如何安装PANABIT?
  10. 连接池实现mysql增删改查_java使用原生MySQL实现数据的增删改查以及数据库连接池技术...
  11. 回溯法——利用解空间树解决0-1背包问题
  12. django如何连接Mysql中已有的数据库
  13. 教师计算机课教学反思范文,信息技术课优秀教学反思
  14. 计算机视觉中的多视图几何<Part0—基础知识:射影几何、变换和估计>(3)
  15. 王者荣耀官网全皮肤超超超清原皮爬取!!!
  16. 【前端小实战】遮罩层动画效果
  17. 我的世界java版多核优化_Minecraft 我的世界服务器优化教程 —— 让多带50%的玩家不再是梦...
  18. HDU 1713 相遇周期【这也算数学吗?】
  19. SSH Secure提示:Server responded Protocol error:packet too long
  20. 教你两分钟做出一个精美好用的404页面

热门文章

  1. UE4 时间膨胀,慢动作(蓝图)
  2. 苹果计算机怎么返回上一步操作,iphone12怎么关闭程序-iphone12怎么返回上一步
  3. 中国汽车协会:我国整车出口数量达到43.8万辆,同比增长92.8%
  4. 能量项链【区间dp】
  5. Android对emoji表情的处理(二)
  6. 博客园主页样式修改(加透明背景和微调位置)
  7. Android 查看图片的位置信息
  8. RTL8192系列RL-UM02B-8192EU双通道USB接口WiFi模块选型参考
  9. (数据结构)[python](11)----链表与栈
  10. 基于prometheus的监控管理平台