From cfbe0315f0aaf9679de38da7fa8a7e461fd4d20e Mon Sep 17 00:00:00 2001 From: LamGC Date: Thu, 2 Sep 2021 15:46:01 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=95=B0=E7=BB=84?= =?UTF-8?q?=E6=93=8D=E4=BD=9C.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 从数组操作中移除 List 的使用(现在是纯数组操作), 添加方法缓存. --- .../sentry/script/ScriptLoggerFactory.java | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/lamgc/oracle/sentry/script/ScriptLoggerFactory.java b/src/main/java/net/lamgc/oracle/sentry/script/ScriptLoggerFactory.java index 8c1b567..1900d67 100644 --- a/src/main/java/net/lamgc/oracle/sentry/script/ScriptLoggerFactory.java +++ b/src/main/java/net/lamgc/oracle/sentry/script/ScriptLoggerFactory.java @@ -9,10 +9,8 @@ import org.slf4j.Marker; import org.slf4j.MarkerFactory; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; /** * 脚本日志记录器工厂. @@ -48,6 +46,9 @@ public class ScriptLoggerFactory implements ScriptComponentFactory { "isErrorEnabled" ); + private final static ConcurrentHashMap METHOD_CACHE_MAP = + new ConcurrentHashMap<>(PROXY_METHOD_NAMES.size(), 1); + private final Logger targetLog; private final Class logClass; @@ -58,22 +59,40 @@ public class ScriptLoggerFactory implements ScriptComponentFactory { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { - if (PROXY_METHOD_NAMES.contains(method.getName())) { + if (METHOD_CACHE_MAP.contains(method)) { + return METHOD_CACHE_MAP.get(method).invoke(targetLog, insertParameterToArray(args, SCRIPT_MARKER)); + } else if (PROXY_METHOD_NAMES.contains(method.getName())) { Class[] types = method.getParameterTypes(); - List> typeList = new ArrayList<>(Arrays.asList(types)); - typeList.add(0, Marker.class); if (types.length != 0 && !Marker.class.isAssignableFrom(types[0])) { - Class[] realMethodParamTypes = typeList.toArray(new Class[0]); + Class[] realMethodParamTypes = insertTypeToArray(types, Marker.class); Method realMethod = logClass.getDeclaredMethod(method.getName(), realMethodParamTypes); - List paramList = new ArrayList<>(Arrays.asList(args)); - paramList.add(0, SCRIPT_MARKER); - Object[] params = paramList.toArray(new Object[0]); - realMethod.invoke(targetLog, params); + METHOD_CACHE_MAP.put(method, realMethod); + realMethod.invoke(targetLog, insertParameterToArray(args, SCRIPT_MARKER)); return null; } } return proxy.invoke(targetLog, args); } + + public Object[] insertParameterToArray(Object[] arr, Object newElement) { + if (arr.length == 0) { + return new Object[] {newElement}; + } + Object[] newArr = new Object[arr.length + 1]; + newArr[0] = newElement; + System.arraycopy(arr, 0, newArr, 1, arr.length); + return newArr; + } + + public Class[] insertTypeToArray(Class[] arr, Class newElement) { + if (arr.length == 0) { + return new Class[] {newElement}; + } + Class[] newArr = new Class[arr.length + 1]; + newArr[0] = newElement; + System.arraycopy(arr, 0, newArr, 1, arr.length); + return newArr; + } } }