From 74ff443db61767c2b4a17668801a8c5a9cbdb5c6 Mon Sep 17 00:00:00 2001 From: "Egor.Ushakov" Date: Mon, 30 May 2016 12:44:32 +0300 Subject: [PATCH] IDEA-156071 Simple static method renderers are much slower than toString - cache TypeEvaluator result --- .../evaluation/expression/TypeEvaluator.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/TypeEvaluator.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/TypeEvaluator.java index 667948e5242c..aa23b7b0d659 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/TypeEvaluator.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/TypeEvaluator.java @@ -26,12 +26,19 @@ import com.intellij.debugger.engine.JVMName; import com.intellij.debugger.engine.evaluation.EvaluateException; import com.intellij.debugger.engine.evaluation.EvaluateExceptionUtil; import com.intellij.debugger.engine.evaluation.EvaluationContextImpl; +import com.intellij.reference.SoftReference; +import com.sun.jdi.ClassLoaderReference; import com.sun.jdi.ReferenceType; import org.jetbrains.annotations.NotNull; +import java.lang.ref.WeakReference; + public class TypeEvaluator implements Evaluator { private final JVMName myTypeName; + private WeakReference myLastResult; + private WeakReference myLastClassLoader; + public TypeEvaluator(@NotNull JVMName typeName) { myTypeName = typeName; } @@ -44,12 +51,19 @@ public class TypeEvaluator implements Evaluator { * @return ReferenceType in the target VM, with the given fully qualified name */ public Object evaluate(EvaluationContextImpl context) throws EvaluateException { + ClassLoaderReference classLoader = context.getClassLoader(); + Object lastRes = SoftReference.dereference(myLastResult); + if (lastRes != null && classLoader == SoftReference.dereference(myLastClassLoader)) { + return lastRes; + } DebugProcessImpl debugProcess = context.getDebugProcess(); String typeName = myTypeName.getName(debugProcess); - final ReferenceType type = debugProcess.findClass(context, typeName, context.getClassLoader()); + ReferenceType type = debugProcess.findClass(context, typeName, classLoader); if (type == null) { throw EvaluateExceptionUtil.createEvaluateException(DebuggerBundle.message("error.class.not.loaded", typeName)); } + myLastClassLoader = new WeakReference<>(classLoader); + myLastResult = new WeakReference<>(type); return type; }