WastEl 表达式引擎性能测试 - 每秒千万次运算超强性能
简介
WAST是一个高性能Java工具集库包,包括JSON、YAML、CSV、HttpClient、JDBC和EL引擎.
下面是单独对WastEl性能测试,测试环境window10 处理器i5 JDK1.8 单线程 idea工具(服务器配置性能中等)
maven依赖
<dependency> <groupId>io.github.wycst</groupId> <artifactId>wast</artifactId> <version>0.0.18</version> </dependency> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId> <version>1.36</version> </dependency> <dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-generator-annprocess</artifactId> <version>1.36</version> </dependency>
测试代码
import io.github.wycst.wast.common.expression.CacheableExpression; import io.github.wycst.wast.common.expression.Expression; import io.github.wycst.wast.common.expression.compile.CompilerExpression; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.runner.Runner; import org.openjdk.jmh.runner.RunnerException; import org.openjdk.jmh.runner.options.Options; import org.openjdk.jmh.runner.options.OptionsBuilder; import org.openjdk.jmh.runner.options.TimeValue; import java.util.concurrent.TimeUnit; /** * @Created by wangyc */ public class WastElPerSecondJmhTest { final static String staticEl = "1+2"; final static String dynamicsEl = "a+a+a+b+b"; final static Expression wastParsedEl; final static Expression wastCompiledEl; final static Fact fact = new Fact(); public static class Fact { public int a = 1; public int b = 2; public int c = 3; } static { wastParsedEl = Expression.parse(dynamicsEl); wastCompiledEl = CompilerExpression.createEnvironment() .objectParameterClass(Fact.class) .variableTypes(int.class, "a", "b") .compile(dynamicsEl); } @Benchmark public Object staticExpr() { return Expression.eval(staticEl); } @Benchmark public Object cacheableStaticExpr() { return CacheableExpression.eval(staticEl); } @Benchmark public Object dynamicsDirect() { return Expression.evalParameters(dynamicsEl, fact.a, fact.b); } @Benchmark public Object dynamicsParsedWithPojo() { return wastParsedEl.evaluate(fact); } @Benchmark public Object dynamicsParsedWithParameters() { return wastParsedEl.evaluateParameters(fact.a, fact.b); } @Benchmark public Object compileParameters() { return wastCompiledEl.evaluateParameters(fact.a, fact.b); } @Benchmark public Object compilePojo() { return wastCompiledEl.evaluate(fact); } @Benchmark public Object javaCode() { return fact.a + fact.a + fact.a + fact.b + fact.b; } public static void main(String[] args) throws RunnerException { System.out.println("staticExpr result " + Expression.eval(staticEl)); System.out.println("cacheableStaticExpr result " + CacheableExpression.eval(staticEl)); System.out.println("dynamicsDirect result " + Expression.evalParameters(dynamicsEl, fact.a, fact.b)); System.out.println("dynamicsParsedWithPojo result " + wastParsedEl.evaluate(fact)); System.out.println("dynamicsParsedWithParameters result " + wastParsedEl.evaluateParameters(fact.a, fact.b)); Options options = new OptionsBuilder() .include(WastElPerSecondJmhTest.class.getName()) .mode(Mode.Throughput) .timeUnit(TimeUnit.SECONDS) .warmupTime(TimeValue.seconds(3)) .measurementTime(TimeValue.seconds(3)) .forks(1) .build(); new Runner(options).run(); } }
运行结果(ops/s 每秒运算次数)
Benchmark Mode Cnt Score Error Units WastElPerSecondJmhTest.cacheableStaticExpr thrpt 5 171657564.516 ± 7995468.134 ops/s WastElPerSecondJmhTest.compileParameters thrpt 5 241759348.205 ± 15257569.604 ops/s WastElPerSecondJmhTest.compilePojo thrpt 5 337235732.558 ± 15465646.140 ops/s WastElPerSecondJmhTest.dynamicsDirect thrpt 5 2303974.920 ± 54792.033 ops/s WastElPerSecondJmhTest.dynamicsParsedWithParameters thrpt 5 33469025.187 ± 433401.164 ops/s WastElPerSecondJmhTest.dynamicsParsedWithPojo thrpt 5 17290195.897 ± 502910.746 ops/s WastElPerSecondJmhTest.javaCode thrpt 5 336520348.857 ± 14309011.816 ops/s WastElPerSecondJmhTest.staticExpr thrpt 5 15374869.767 ± 325368.159 ops/s
结论
- 解析模式下执行静态表达式在无缓存的情况下每秒1.5千万次(注包含解析过程)
- 解析模式下执行静态表达式在有缓存的情况下每秒1.6亿次(只解析一次)
- 编译模式下包含4次加法运算的动态表达式每秒最高3亿次基本上和java代码每秒运行的次数持平
第三方测试目前只加入过express-benchmark (作者闲.大赋),结果有两月没更新了,无奈自己贴下个人运行的结果
public class Test { public static void main(String[] args) throws Exception { org.openjdk.jmh.Main.main(args); } }
下面是在JDK17下运行 的结果(每秒运算次数)
Benchmark Mode Cnt Score Error Units Aviator.forExpresss thrpt 5 394144.816 ± 43654.175 ops/s Aviator.ifExpresss thrpt 5 3963746.142 ± 131093.900 ops/s Aviator.simpleExpress thrpt 5 3308604.053 ± 25862.339 ops/s Beetl.forExpresss thrpt 5 1443597.295 ± 41988.440 ops/s Beetl.ifExpresss thrpt 5 4403695.596 ± 113498.704 ops/s Beetl.reflect thrpt 5 83723.859 ± 40897.270 ops/s Beetl.simpleExpress thrpt 5 4386398.540 ± 111306.217 ops/s Groovy.ifExpresss thrpt 5 303806.258 ± 12134.866 ops/s Groovy.simpleExpress thrpt 5 302431.969 ± 8039.171 ops/s Jexl3.forExpresss thrpt 5 747716.738 ± 25959.630 ops/s Jexl3.ifExpresss thrpt 5 3806159.078 ± 99125.411 ops/s Jexl3.simpleExpress thrpt 5 3413623.305 ± 56783.177 ops/s JfireEL.ifExpresss thrpt 5 34195894.961 ± 357271.824 ops/s JfireEL.simpleExpress thrpt 5 24998273.343 ± 2685584.807 ops/s Liquor.forExpresss thrpt 5 195481886.461 ± 2464897.556 ops/s Liquor.ifExpresss thrpt 5 205435909.028 ± 5286307.686 ops/s Liquor.simpleExpress thrpt 5 200625386.760 ± 2214530.143 ops/s Mvel.forExpresss thrpt 5 4415.331 ± 60.968 ops/s Mvel.ifExpresss thrpt 5 184213.448 ± 58112.716 ops/s Mvel.simpleExpress thrpt 5 253283.417 ± 42492.561 ops/s Nashorn.ifExpresss thrpt 5 13056.037 ± 2274.430 ops/s Nashorn.simpleExpress thrpt 5 12543.251 ± 1230.481 ops/s Spel.ifExpresss thrpt 5 19045225.353 ± 300079.309 ops/s Spel.simpleExpress thrpt 5 18670957.394 ± 203441.671 ops/s WastEl.forExpresss thrpt 5 702537069.120 ± 1918356.393 ops/s WastEl.ifExpresss thrpt 5 1102947933.898 ± 11004950.388 ops/s WastEl.simpleExpress thrpt 5 626007123.964 ± 14879444.442 ops/s
对结果有质疑的或者有感兴趣的也可以自己把代码拉下来试试
WastEl文档地址
源码地址
- gitee: https://gitee.com/xiaoch0209/wast
- github: https://github.com/wycst/wast

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Transformer 作者最新访谈:为什么谷歌没第一个做出 ChatGPT
2017 年,谷歌的八位机器学习研究员发表了一篇具有开创性的研究论文《Attention Is All You Need》,首次提出了 Transformer AI 架构。这一架构现在已经成了几乎所有主流生成式 AI 模型的基础。 Transformer 是现代 AI 热潮的一个关键组成部分,它通过使用神经网络将输入数据块(被称为 “Token”)转换成另一种所需的输出形式。各种 Transformer 架构的变体为语言模型(如 GPT-4 和 ChatGPT)、音频合成模型(如谷歌的 NotebookLM 和 OpenAI 的高级语音模式)、视频合成模型(如 Sora)以及图像合成模型(如 Midjourney)提供了支持。 在今年 10 月的 TED AI 大会上,技术新闻资讯网站 Ars Technica 采访了《Attention Is All You Need》共同作者之一 Jakob Uszkoreit,采访过程中 Uszkoreit 介绍了关于 Transformer 的开发、谷歌早期大模型的研究工作以及他在生物计算领域的新创业项目。 在采访中,Uszkoreit 提到,...
- 下一篇
工作写代码,放假写书,最后豆瓣评分 9.1
在小编的争取下,本文作者贺波和人民邮电出版社异步社区答应来个赠书小福利😀~ 自本文发布一周时间内,在下方评论区发表关于工作流的相关内容或对本书的期待,将有机会免费获得一本书。 我们会根据评论内容,选取3名用户各赠送一本《深入Activiti流程引擎:核心原理与高阶实战》或者《深入Flowable流程引擎:核心原理与高阶实战》。可以自己选择要哪一本哦!评论区见~ 双11那天,开源中国的肖老师联系我,邀请我去做一次直播分享。我感到非常荣幸,但考虑到最近一直都比较忙,我婉拒了,并提出在周末为开源中国写一篇文章的替代方案。 同样是在这一天,我收到了人民邮电出版社郭老师的好消息:我去年出版的《深入Activiti流程引擎:核心原理与高阶实战》已经启动了第7次印刷。而距离我上个月新书《深入Flowable流程引擎:核心原理与高阶实战》的发布也刚好一个月。这些消息让我感到非常振奋,让我思考起如何继续在技术领域深耕和发展。 这几天,我一直在构思给肖老师的文章主题。想来想去,想到去年初受IT东方会技术高管年会邀请去做过一次分享。那次大会的主题是寻找“数字经济时代下的第二曲线”。嘉宾们纷纷交流数字化转型...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 2048小游戏-低调大师作品
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块