【Java表达式语言】Aviator与SpringSpel性能比较

更新时间:2023-07-04 14:44:12 阅读: 评论:0

【Java表达式语⾔】Aviator与SpringSpel性能⽐较
⽬录
下巴突出>电影淮海战役
1 collection 数据场景性能对⽐
场景⽰例:满⾜ ains(categoryId) 的条件。下⾯会根据这个表达式设计测试⽅案。
1.1 测试场景说明
这⾥以实际性能测试的⽅法名作为场景代号。
1.1.1 Java 代码执⾏场景
executeWithoutExpression:不⽤表达式,直接运⾏ Java 代码
1.1.2 aviator 场景
场景特性对⽐
场景代号是否编译是否预编译编译结果是否缓存
aviatorValidate N N N
aviatorValidateWithPreviewCachedCompile Y Y Y
aviatorValidateWithCachedCompile Y N Y 场景特性详细说明
编译:调⽤ aviator 的 compile ⽅法,将表达式编译成字节码
预编译(线程安全):全局⽣成唯⼀⼀个编译后的对象,每次执⾏表达式的时候复⽤这个编译后的对象。因为实际业务场景下表达式是基本不变的,所以在可穷举的情况下,预先可以做好 aviator 的编译,后⾯需要变更的只是变量的值⽽已。
缓存编译结果: aviator ⽀持缓存编译结果,这样如果每次解析的表达式相同的时候,则可以从全局缓存中获取。另外提⼀下,这个缓存采⽤的是 LRU 淘汰策略。1.1.3 spel 场景
场景特性对⽐
场景代号是否引⼊上下
是否引⼊数据对
是否提前⽣成解析
是否通过数据对象执⾏业务逻
spelValidateWithContext Y N N N spelValidate N Y N N spelValidateWithInnerFunction N Y N Y spelValidateWithInnerFunctionAndContext Y Y N Y spelValidateWithInnerFunctionAndContextAndPreviewNewInstance Y Y Y Y 场景特性详细说明
上下⽂:spel ⽀持直接解析 root object,也⽀持通过 context 来添加变量,⽤来构建表达式的执⾏环境
数据对象:即 root object,包括执⾏业务逻辑的全部变量
提前⽣成解析器:全局唯⼀⼀个 spel 解析器和上下⽂,每次执⾏表达式的时候都复⽤这个解析器和上下⽂,只需要修改数据即可
通过数据对象执⾏业务逻辑:表达式不关⼼业务逻辑,业务逻辑交给 root object 中的⽅法来实现,表达式只管调⽤ root object 中的⽅法1.2 测试数据⽣成规则
规则集合:在 0~10w 之间随机⽣成 1w 个数
需要匹配的数值:在 0~10w 之间随机⽣成
import java.util.List;
import java.util.Set;
/**
* @author lihaike
* @date 2021/1/21
*/
@Data
public class CollectionExpressionData {
private Set<Long> allCategoryIdSet;
private List<Long> categoryIdSet;
public void init(int testCount) {
categoryIdSet = wArrayList();
allCategoryIdSet = wHashSet();
// 总集合设置为⼦集合的 10 倍
int allCount = 10000;
int allNumber = 10 * allCount;
for (int i = 0; i < testCount; i++) {
categoryIdSet.add((long) (Math.random() * allNumber));
}
for (int i = 0; i < allCount; i++) {
allCategoryIdSet.add((long) (Math.random() * allNumber));
}
}
}
1.3 实际性能⽐对
时间单位:ns
场景代号
循环执⾏100w次循环执⾏10w次循环执⾏1w次
第⼀次执⾏时间全部平均
时间
排除第⼀
次平均时
第⼀次执⾏时
全部平均
时间
排除第
⼀次平
中秋节的介绍均时间
第⼀次执⾏时
全部平均
时间
排除第⼀
次平均时
白带有点红
executeWithoutExpression27969626221536737355694313308 aviatorValidate44454183413347713303274012526610380296401816483934225231143597 aviatorValidateWithCachedCompile2121730187184926645359350941956559464 aviatorValidateWithPreviewCachedCompile33915126126360902282278539269269 spelValidateWit
hContext31538816484348124478237468596411312389242190818786 spelValidate76304088462845553856189352929858594302429923716 spelValidateWithInnerFunction278180183018292355682131212817129933703354 spelValidateWithInnerFunctionAndContext138241205420541125692317231610792752925282 spelValidateWithInnerFunctionAndContextAndPreviewNewInstance12818447447351305475472727814161414 1.4 ⼩结
在 collection 的规则验证场景下
aviator 的性能⽐ spel 更优
最佳实践上
aviator 最佳实践:aviatorValidateWithPreviewCachedCompile 性能最好,但是需要做全局缓存。如果不是极致追求性能的话可以考虑
aviatorValidateWithCachedCompile
spel 最佳实践:spelValidateWithInnerFunctionAndContextAndPreviewNewInstance
2 String 数据场景性能对⽐
场景⽰例:根据商品名称设定了⼀些敏感词,如“猪”,“杀”,“法”等,实际业务中需要根据商品名称是否包含有这些名称判断是否违规。
2.1 测试场景说明
根据 1 collection 数据场景性能对⽐ 筛选出四种最佳实现场景,场景特性配置与第⼀节相同
2.2 测试数据⽣成说明
“违规”字符串是固定的
测试商品名称数据是固定的⼗个字符串,随机取三个进⾏组合拼接的
import java.util.List;
import java.util.Set;
/**
* @author lihaike
* @date 2021/1/21
*/
@Data
public class StringExpressionData {
private static List<String> testStringList = wArrayList("looking for an evaluator",            "simple condition expressions",
"Expressions should include variables ",
"法务的锅",
" strings, $numbers",
" 会发给",
"快的惊⼈⼥了愤怒",
"够了吗",
"啊;哈价格;阿济格",
"我,#");蚂蚁篇
private List<String> bannedString;
private List<String> nameList;
public void init(int testCount) {
bannedString = wArrayList("猪", "狗", "妖", "#", "$", "法");
nameList = wArrayList();
// 总集合设置为⼦集合的 10 倍
int allNumber = 10;
int x, y, z;
for (int i = 0; i < testCount; i++) {
x = (int) (Math.random() * allNumber);
y = (int) (Math.random() * allNumber);
z = (int) (Math.random() * allNumber);
nameList.(x) + (y) + (z));        }
}
}
2.3 实际性能对⽐
时间单位:ns
场景代号循环执⾏1000w次循环执⾏100w次循环执⾏10w次循环执⾏1w次
第⼀次执⾏
时间
全部
平均
时间
排除
第⼀
次平
均时
第⼀次执⾏
时间
全部
平均
时间
排除
第⼀
家常炸酱面的做法
次平
均时
第⼀次执⾏
时间
全部
平均
时间
排除
第⼀
次平
均时
五行八卦福第⼀次执⾏
时间
全部
平均
时间
executeWithoutExpression35867108108362491071073300115215233834165 aviatorValidateWithC
achedCompile3518183224223345966626225842018358658233584255791 aviatorValidateWithPreviewCachedCompile35746210210361321741742771126826827631289 spelValidateWithInnerFunctionAndContextAndPreviewNewInstance26838047798795308278867437123652433724852120399648312657 2.4 ⼩结
在 string 匹配的规则验证场景下
aviator 的性能⽐ spel 更优
aviator 最佳实践:aviatorValidateWithPreviewCachedCompile 性能最好,但是需要做全局缓存。如果不是极致追求性能的话可以考虑
aviatorValidateWithCachedCompile
3 数值数据场景性能对⽐
场景⽰例:⽐如⽐对商品宽⾼⼤⼩。
3.1 测试场景说明
根据 1 collection 数据场景性能对⽐ 筛选出四种最佳实现场景,场景特性配置与第⼀节相同
3.2 测试数据⽣成说明
模拟测试的 size,max,min ⼤⼩数值都是根据循环测试次数,随即⽣成的
import lombok.Data;
import java.util.List;
/**
* @author lihaike
* @date 2021/1/21
*/
@Data
public class NumberExpressionData {
private List<Long> numberList;
private long min;
private long max;
public void init(int testCount) {
numberList = wArrayListWithExpectedSize(testCount);        for (int i = 0; i < testCount; i++) {
numberList.add((long) (Math.random() * testCount));
}
min = (long) (Math.random() * testCount);
max = (long) (Math.random() * testCount);
}
}
3.3 实际性能对⽐
时间单位:ns
场景代号循环执⾏1000w次循环执⾏100w次循环执⾏10w次循环执⾏1w次
第⼀次执⾏时
全部
平均
时间
排除
冬奥会2022第⼀
次平
均时
第⼀次执⾏时
全部
平均
时间
排除
第⼀
次平
均时
第⼀次执⾏时
全部
平均
时间
排除
第⼀
次平
均时
第⼀次执⾏时
executeWithoutExpression1494222170139920134464618324 aviatorValidateWithCachedCompile3757806792732354287892067152864652775425262609476551597 aviatorValidateWithPreviewCachedCompile32612173173353852292283048030130110675 spelValidateWithInnerFunctionAndContextAndPreviewNewInstance2700657146246032145005777745360956262388238831256699 3.4 ⼩结
在数值匹配的规则验证场景下
aviator 的性能⽐ spel 更优
aviator 最佳实践:aviatorValidateWithPreviewCachedCompile 性能最好,但是需要做全局缓存。如果不是极致追求性能的话可以考虑
aviatorValidateWithCachedCompile
4 总结
aviator 不⽀持对字符串做循环匹配,开发成本不⾼。⼀般的⾃定义函数开发⼈⼒不到半个⼈⽇。
aviator 最佳实践:aviatorValidateWithPreviewCachedCompile 性能最好,但是需要做全局缓存。如果不是极致追求性能的话可以考虑
aviatorValidateWithCachedCompile
5 相关代码
性能测试代码见附件:
function.zip
8.76KB

本文发布于:2023-07-04 14:44:12,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1078084.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:场景   性能   是否   业务   表达式
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图