From 8768d54e96c9c6511f61a96bd54a36cb20e937bf Mon Sep 17 00:00:00 2001 From: aLIEz <121407312@qq.com> Date: Tue, 23 Aug 2022 09:09:26 +0000 Subject: [PATCH] =?UTF-8?q?MagicScript=E7=BC=93=E5=AD=98=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=20=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E4=B8=8D=E7=BC=93=E5=AD=98=E8=80=97=E6=97=B64000ms?= =?UTF-8?q?=EF=BC=8C=E7=BC=93=E5=AD=98=E4=B9=8B=E5=90=8E=E8=80=97=E6=97=B6?= =?UTF-8?q?200ms=20public=20static=20void=20main(String[]=20args)=20{=20?= =?UTF-8?q?=09LocalDateTime=20now=20=3D=20LocalDateTime.now();=20=09for=20?= =?UTF-8?q?(int=20i=20=3D=200;=20i=20<=2010000;=20i++)=20{=20=09=09execute?= =?UTF-8?q?Script("val=20a=20=3D=20'2'\nval=20b=20=3D=203\nreturn=20b=20+?= =?UTF-8?q?=201=20+=20a=20+=201",=20new=20MagicScriptContext());=20=09}=20?= =?UTF-8?q?=09System.out.println(executeScript("val=20a=20=3D=20'2'\nval?= =?UTF-8?q?=20b=20=3D=203\nreturn=20b=20+=201=20+=20a=20+=201",=20new=20Ma?= =?UTF-8?q?gicScriptContext()));=20=09System.out.println(now.until(LocalDa?= =?UTF-8?q?teTime.now(),=20ChronoUnit.MILLIS));=20}?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: aLIEz <121407312@qq.com> --- .../java/org/ssssssss/script/MagicScript.java | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/ssssssss/script/MagicScript.java b/src/main/java/org/ssssssss/script/MagicScript.java index e64b7aa..65dce1b 100644 --- a/src/main/java/org/ssssssss/script/MagicScript.java +++ b/src/main/java/org/ssssssss/script/MagicScript.java @@ -24,9 +24,12 @@ import javax.script.CompiledScript; import javax.script.ScriptContext; import javax.script.ScriptEngine; import java.lang.reflect.Constructor; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; public class MagicScript extends CompiledScript { @@ -48,7 +51,12 @@ public class MagicScript extends CompiledScript { private final Set varIndices; /** - * 编译后的类 + * 是否已经编译过 + */ + private final AtomicBoolean compile = new AtomicBoolean(false); + + /** + * 如果是简单的取值操作,则跳过编译 */ private MagicScriptVariableAccessRuntime accessRuntime; @@ -135,6 +143,18 @@ public class MagicScript extends CompiledScript { return this.accessRuntime = new MagicScriptVariableAccessRuntime(((VariableAccess) returnNode.getReturnValue()).getVarIndex().getName()); } } + if (!compile.get()) { + synchronized (compile) { + if (!compile.get()) { + compile0(); + compile.set(true); + } + } + } + return buildRuntime(); + } + + private void compile0() { try { MagicScriptCompiler compiler = new MagicScriptCompiler(this.varIndices, this.debug); nodes.forEach(node -> node.visitMethod(compiler)); @@ -159,7 +179,6 @@ public class MagicScript extends CompiledScript { this.varNames = varIndices.stream().map(VarIndex::getName).toArray(String[]::new); // 设置所有Span this.spans = compiler.getSpans(); - return buildRuntime(); } catch (MagicScriptException mse) { throw new MagicScriptCompileException(mse.getSimpleMessage(), mse); } catch (MagicScriptCompileException e) { @@ -171,12 +190,12 @@ public class MagicScript extends CompiledScript { private MagicScriptRuntime buildRuntime() { try { - MagicScriptRuntime target = constructor.newInstance(); - // 设置变量名字 - target.setVarNames(this.varNames); - // 设置所有Span - target.setSpans(this.spans); - return target; + MagicScriptRuntime runtime = constructor.newInstance(); + // 设置变量名字,为Runtime拷贝副本 + runtime.setVarNames(Arrays.copyOf(this.varNames, this.varNames.length)); + // 设置所有Span,为Runtime拷贝副本 + runtime.setSpans(new ArrayList<>(this.spans)); + return runtime; } catch (Exception e) { throw new MagicScriptCompileException(e); } -- Gitee