From 6bbe248cea6e5ad716697c7c5eab069173fe4a01 Mon Sep 17 00:00:00 2001 From: wangyunchao Date: Sun, 11 Dec 2022 19:41:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A1=A8=E8=BE=BE=E5=BC=8F?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E6=A8=A1=E5=BC=8F=E4=BD=BF=E7=94=A8=E4=BE=8B?= =?UTF-8?q?=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../expression/ExprCompilerJavassistTest.java | 69 +++++++++++++++++++ .../expression/ExprCompilerNativeTest.java | 49 +++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 src/test/java/com/wast/test/expression/ExprCompilerJavassistTest.java create mode 100644 src/test/java/com/wast/test/expression/ExprCompilerNativeTest.java diff --git a/src/test/java/com/wast/test/expression/ExprCompilerJavassistTest.java b/src/test/java/com/wast/test/expression/ExprCompilerJavassistTest.java new file mode 100644 index 0000000..387c44b --- /dev/null +++ b/src/test/java/com/wast/test/expression/ExprCompilerJavassistTest.java @@ -0,0 +1,69 @@ +package com.wast.test.expression; + +import io.github.wycst.wast.common.expression.EvaluateEnvironment; +import io.github.wycst.wast.common.expression.Expression; +import io.github.wycst.wast.common.expression.compile.CompilerEnvironment; +import io.github.wycst.wast.common.expression.compile.CompilerExpression; +import io.github.wycst.wast.common.expression.functions.JavassistExprFunction; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Author: wangy + * @Date: 2022/11/6 11:36 + * @Description: + */ +public class ExprCompilerJavassistTest { + + public static void main(String[] args) { + + String el = "arg.a+arg.b+@max(140,113,arg.b)"; + + Map aa = new HashMap(); + aa.put("a", 120); + aa.put("b", 150); + + Map map = new HashMap(); + map.put("arg", aa); + map.put("b", 8); + map.put("c", 1); + map.put("中路", 1d); + + EvaluateEnvironment evaluateEnvironment = EvaluateEnvironment.create(map); + evaluateEnvironment.registerStaticMethods(Math.class); + + double result = 0, a = 4, b = 5; + CompilerEnvironment compileEnvironment = new CompilerEnvironment(); + compileEnvironment.setSkipParse(true); + compileEnvironment.setVariableType(int.class, "arg.a", "arg.b"); + compileEnvironment.registerJavassistFunction("max", new JavassistExprFunction() { + + @Override + public Integer execute(Integer... p) { + return 1; + } + }, int.class, int.class, int.class, int.class); + + System.out.println(CompilerExpression.generateJavaCode(el, compileEnvironment)); + + long s1 = System.currentTimeMillis(); + CompilerExpression compiler = CompilerExpression.compile(el, compileEnvironment, CompilerExpression.Coder.Javassist); + long s2 = System.currentTimeMillis(); + System.out.println("==== eval2 " + compiler.evaluate(map)); + + Object r = Expression.eval(el, map); + + System.out.println(" == compile " + (s2 - s1)); + + long l1 = System.currentTimeMillis(); + for (int i = 0 ; i < 100000000; i++) { + } + + long l2 = System.currentTimeMillis(); + System.out.println(l2 - l1); + System.out.println(result); + } + + +} diff --git a/src/test/java/com/wast/test/expression/ExprCompilerNativeTest.java b/src/test/java/com/wast/test/expression/ExprCompilerNativeTest.java new file mode 100644 index 0000000..4a3a4d0 --- /dev/null +++ b/src/test/java/com/wast/test/expression/ExprCompilerNativeTest.java @@ -0,0 +1,49 @@ +package com.wast.test.expression; + +import io.github.wycst.wast.common.expression.EvaluateEnvironment; +import io.github.wycst.wast.common.expression.Expression; +import io.github.wycst.wast.common.expression.compile.CompilerEnvironment; +import io.github.wycst.wast.common.expression.compile.CompilerExpression; +import io.github.wycst.wast.common.expression.functions.JavassistExprFunction; + +import java.util.HashMap; +import java.util.Map; + +/** + * @Author: wangy + * @Date: 2022/11/6 11:36 + * @Description: + */ +public class ExprCompilerNativeTest { + + public static void main(String[] args) { + + String el = "arg.a+arg.b+b+c"; + CompilerEnvironment compileEnvironment = new CompilerEnvironment(); + + // 如果设置false会将表达式进行先解析再编译; + // 如果设置为true将跳过解析在代码中直接return,此时最好使用setVariableType来声明变量类型 + // 不伦是否设置skipParse,使用setVariableType来声明变量类型都是不错的选择,能大大提高效率 + compileEnvironment.setSkipParse(true); + compileEnvironment.setVariableType(int.class, "arg.a", "arg.b", "b", "c"); + + // 输出编译的源代码 + System.out.println(CompilerExpression.generateJavaCode(el, compileEnvironment)); + CompilerExpression compiler = CompilerExpression.compile(el, compileEnvironment, CompilerExpression.Coder.Native); + + + Map aa = new HashMap(); + aa.put("a", 120); + aa.put("b", 150); + + Map var = new HashMap(); + var.put("arg", aa); + var.put("b", 8); + var.put("c", 1); + + // 执行 + System.out.println("==== eval result " + compiler.evaluate(var)); + } + + +}