From 438e61c998298b48830d5be76668df45629a1eb0 Mon Sep 17 00:00:00 2001 From: aclement Date: Wed, 1 Sep 2004 10:30:07 +0000 Subject: [PATCH] Enhancement for Bugzilla Bug 49743 performance improvements for runtime library (From Matthew) --- lib/test/aspectjrt.jar | Bin 35627 -> 35991 bytes .../runtime/reflect/AdviceSignatureImpl.java | 2 +- .../reflect/CatchClauseSignatureImpl.java | 2 +- .../reflect/ConstructorSignatureImpl.java | 2 +- .../org/aspectj/runtime/reflect/Factory.java | 2 +- .../runtime/reflect/FieldSignatureImpl.java | 2 +- .../reflect/InitializerSignatureImpl.java | 2 +- .../runtime/reflect/MethodSignatureImpl.java | 2 +- .../runtime/reflect/SignatureImpl.java | 38 +++++- .../runtime/reflect/SourceLocationImpl.java | 9 +- .../aspectj/runtime/reflect/StringMaker.java | 6 + runtime/testsrc/RuntimeModuleTests.java | 4 +- .../reflect/RuntimePerformanceTest.java | 111 ++++++++++++++++++ .../runtime/reflect/SignatureTest.java | 11 ++ 14 files changed, 177 insertions(+), 16 deletions(-) create mode 100644 runtime/testsrc/org/aspectj/runtime/reflect/RuntimePerformanceTest.java diff --git a/lib/test/aspectjrt.jar b/lib/test/aspectjrt.jar index 976e2737ea134b4124a5130aabcda90f2428c80f..c4febb32373845a205bbc185c5bc6d22258cdca2 100644 GIT binary patch delta 15016 zcmaKT1yo#1&}MKQ+zIXwT!Xv2yE_DT8+33I7~I|6-Q8V-Cb$O(k_0v(Z+GAO_naN( z+^@Ut*HwL*>Dyghbt{q~Q_>&-%5qT9h;ROU47AAN0hCnwT4b!R^?xqVztPdfiuwN% ze>37WX`uc<;Ja6-;dq4u=05<&gW!2ZH3%`N-%7!05Ztf00I~2#-cSaq4)Lc@4_ycO zN@N9)gT4ITHhhD{`YSj=r3Y{LVS}Ae5W%Vl4X-2xWCk#gKR#FH z?mt={{vpzXs{;srH_myjpP;@23!;|&Q~vo6mmWLe+%XWJAchey?s^HAV~!HD;TFx0v8c~er*>@q6dloTho6= zQXCva#RX;#L26(nPyVZIoTB(|!Ieq~`cF$RD}V^>1c45|2t{kSp;Lx^6`r8}70QI6 zH-xdcz`P1yw5h;oAqWk$TyTFoU}VS$HsU4(8n|w#qX}?(ywg*eA9S8?4cmkKU@;O& zYZO)tD3n2DQk2F7&*LCQ`JK}?QAs7s{UCXO`iYckvx%R&n}l!pD1_`=BY&oCOU-{p zYIARWxzIIes~?(Ivuv2?Gl#0y*K-(o?2D`f0G(Ue(A zt3SV*Qgr?3i|tw?BHezbYiYJ}YrlKn3vBIiY{9QiHmGq(J;!PJ2{mxa)4ll>G-3yU zj7d7d+}Pvu*kmoUH?(agP&X?-);v$2640HI72i))NTV*yH0d0#0?}pWT46FS6jpfRp71Nl+Sm1XcdFDIxCZKX=FiW+K>sO5{!&t^u! zL;b-LT`W0H{ayh;&91u%K4SN>6A3DwWkDo<0)t&g(bC=NdjRTnY_KCIf4?U|H(dOA z-@Fs{rEO{OJR4#;LQR}MfC~j)7r1z(?FHcAlS#S#_IcsDfH;PY4)@1GA)@z-cpiTBDPo(s&j5Th*dzz_iCIDF8ZKL zW~SioCGLLmT3^a6gGG<=LLEO!MelTJ;JqcEW`Wv1gP}nt28Uz%CdGs@D|PdVt(fDg zVMv$khveGeGgZptvd^cU@7dQyw{@>Vj=^xM6?tSQRdHOgVgthwd*q6QNZW7_9Cn~| z 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 delta 14571 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 diff --git a/runtime/src/org/aspectj/runtime/reflect/AdviceSignatureImpl.java b/runtime/src/org/aspectj/runtime/reflect/AdviceSignatureImpl.java index 029d4e6de..7efe2cd7d 100644 --- a/runtime/src/org/aspectj/runtime/reflect/AdviceSignatureImpl.java +++ b/runtime/src/org/aspectj/runtime/reflect/AdviceSignatureImpl.java @@ -39,7 +39,7 @@ class AdviceSignatureImpl extends CodeSignatureImpl implements AdviceSignature { return returnType; } - String toString(StringMaker sm) { + protected String createToString(StringMaker sm) { //XXX this signature needs a lot of work StringBuffer buf = new StringBuffer("ADVICE: "); buf.append(sm.makeModifiersString(getModifiers())); diff --git a/runtime/src/org/aspectj/runtime/reflect/CatchClauseSignatureImpl.java b/runtime/src/org/aspectj/runtime/reflect/CatchClauseSignatureImpl.java index a0ca7dbdb..15d9dcaa3 100644 --- a/runtime/src/org/aspectj/runtime/reflect/CatchClauseSignatureImpl.java +++ b/runtime/src/org/aspectj/runtime/reflect/CatchClauseSignatureImpl.java @@ -41,7 +41,7 @@ class CatchClauseSignatureImpl extends SignatureImpl implements CatchClauseSigna return parameterName; } - String toString(StringMaker sm) { + protected String createToString(StringMaker sm) { return "catch(" + sm.makeTypeName(getParameterType()) + ")"; } } diff --git a/runtime/src/org/aspectj/runtime/reflect/ConstructorSignatureImpl.java b/runtime/src/org/aspectj/runtime/reflect/ConstructorSignatureImpl.java index c9576baaa..520cfdf09 100644 --- a/runtime/src/org/aspectj/runtime/reflect/ConstructorSignatureImpl.java +++ b/runtime/src/org/aspectj/runtime/reflect/ConstructorSignatureImpl.java @@ -29,7 +29,7 @@ class ConstructorSignatureImpl extends CodeSignatureImpl implements ConstructorS public String getName() { return ""; } - String toString(StringMaker sm) { + protected String createToString(StringMaker sm) { StringBuffer buf = new StringBuffer(); buf.append(sm.makeModifiersString(getModifiers())); buf.append(sm.makePrimaryTypeName(getDeclaringType(),getDeclaringTypeName())); diff --git a/runtime/src/org/aspectj/runtime/reflect/Factory.java b/runtime/src/org/aspectj/runtime/reflect/Factory.java index 1c2b2f2bb..01bc8eff3 100644 --- a/runtime/src/org/aspectj/runtime/reflect/Factory.java +++ b/runtime/src/org/aspectj/runtime/reflect/Factory.java @@ -148,6 +148,6 @@ public final class Factory { public SourceLocation makeSourceLoc(int line, int col) { - return new SourceLocationImpl(lexicalClass, this.filename, line, col); + return new SourceLocationImpl(lexicalClass, this.filename, line); } } diff --git a/runtime/src/org/aspectj/runtime/reflect/FieldSignatureImpl.java b/runtime/src/org/aspectj/runtime/reflect/FieldSignatureImpl.java index b04f23525..c56ca5212 100644 --- a/runtime/src/org/aspectj/runtime/reflect/FieldSignatureImpl.java +++ b/runtime/src/org/aspectj/runtime/reflect/FieldSignatureImpl.java @@ -35,7 +35,7 @@ public class FieldSignatureImpl extends MemberSignatureImpl implements FieldSign return fieldType; } - String toString(StringMaker sm) { + protected String createToString(StringMaker sm) { StringBuffer buf = new StringBuffer(); buf.append(sm.makeModifiersString(getModifiers())); if (sm.includeArgs) buf.append(sm.makeTypeName(getFieldType())); diff --git a/runtime/src/org/aspectj/runtime/reflect/InitializerSignatureImpl.java b/runtime/src/org/aspectj/runtime/reflect/InitializerSignatureImpl.java index d7301d8ac..740ec07f3 100644 --- a/runtime/src/org/aspectj/runtime/reflect/InitializerSignatureImpl.java +++ b/runtime/src/org/aspectj/runtime/reflect/InitializerSignatureImpl.java @@ -32,7 +32,7 @@ class InitializerSignatureImpl extends CodeSignatureImpl implements InitializerS return Modifier.isStatic(getModifiers()) ? "": ""; } - String toString(StringMaker sm) { + protected String createToString(StringMaker sm) { StringBuffer buf = new StringBuffer(); buf.append(sm.makeModifiersString(getModifiers())); buf.append(sm.makePrimaryTypeName(getDeclaringType(),getDeclaringTypeName())); diff --git a/runtime/src/org/aspectj/runtime/reflect/MethodSignatureImpl.java b/runtime/src/org/aspectj/runtime/reflect/MethodSignatureImpl.java index 1ec8c6914..7e667425d 100644 --- a/runtime/src/org/aspectj/runtime/reflect/MethodSignatureImpl.java +++ b/runtime/src/org/aspectj/runtime/reflect/MethodSignatureImpl.java @@ -38,7 +38,7 @@ class MethodSignatureImpl extends CodeSignatureImpl implements MethodSignature { return returnType; } - String toString(StringMaker sm) { + protected String createToString(StringMaker sm) { StringBuffer buf = new StringBuffer(); buf.append(sm.makeModifiersString(getModifiers())); if (sm.includeArgs) buf.append(sm.makeTypeName(getReturnType())); diff --git a/runtime/src/org/aspectj/runtime/reflect/SignatureImpl.java b/runtime/src/org/aspectj/runtime/reflect/SignatureImpl.java index 9c8d226ac..9045880e0 100644 --- a/runtime/src/org/aspectj/runtime/reflect/SignatureImpl.java +++ b/runtime/src/org/aspectj/runtime/reflect/SignatureImpl.java @@ -16,14 +16,19 @@ package org.aspectj.runtime.reflect; import org.aspectj.lang.Signature; +import java.lang.ref.SoftReference; import java.util.Hashtable; import java.util.StringTokenizer; abstract class SignatureImpl implements Signature { + + private static boolean useCache = true; + int modifiers = -1; String name; String declaringTypeName; Class declaringType; + SoftReference toStringCacheRef; SignatureImpl(int modifiers, String name, Class declaringType) { this.modifiers = modifiers; @@ -31,7 +36,24 @@ abstract class SignatureImpl implements Signature { this.declaringType = declaringType; } - abstract String toString(StringMaker sm); + protected abstract String createToString (StringMaker sm); + + /* Use a soft cache for the short, middle and long String representations */ + String toString (StringMaker sm) { + String[] toStringCache = null; + if (toStringCacheRef == null || toStringCacheRef.get() == null) { + toStringCache = new String[3]; + if (useCache) toStringCacheRef = new SoftReference(toStringCache); + } + else { + toStringCache = (String[])toStringCacheRef.get(); + } + + if (toStringCache[sm.cacheOffset] == null) { + toStringCache[sm.cacheOffset] = createToString(sm); + } + return toStringCache[sm.cacheOffset]; + } public final String toString() { return toString(StringMaker.middleStringMaker); } public final String toShortString() { return toString(StringMaker.shortStringMaker); } @@ -92,7 +114,7 @@ abstract class SignatureImpl implements Signature { } // lazy version - String stringRep; + private String stringRep; ClassLoader lookupClassLoader = null; public void setLookupClassLoader(ClassLoader loader) { @@ -193,4 +215,16 @@ abstract class SignatureImpl implements Signature { for (int i = 0; i < N; i++) ret[i]= makeClass(st.nextToken()); return ret; } + + /* + * Used for testing + */ + static void setUseCache (boolean b) { + useCache = b; + } + + static boolean getUseCache () { + return useCache; + } + } diff --git a/runtime/src/org/aspectj/runtime/reflect/SourceLocationImpl.java b/runtime/src/org/aspectj/runtime/reflect/SourceLocationImpl.java index d69bec612..b55877dc4 100644 --- a/runtime/src/org/aspectj/runtime/reflect/SourceLocationImpl.java +++ b/runtime/src/org/aspectj/runtime/reflect/SourceLocationImpl.java @@ -20,23 +20,20 @@ class SourceLocationImpl implements SourceLocation { Class withinType; String fileName; int line; - int column; - SourceLocationImpl(Class withinType, String fileName, int line, int column) { + SourceLocationImpl(Class withinType, String fileName, int line) { this.withinType = withinType; this.fileName = fileName; this.line = line; - this.column = column; } public Class getWithinType() { return withinType; } public String getFileName() { return fileName; } public int getLine() { return line; } - public int getColumn() { return column; } + public int getColumn() { return -1; } public String toString() { - return getFileName() + ":" + getLine() + - ((getColumn() == -1) ? "" : ":" + getColumn()); + return getFileName() + ":" + getLine(); } } diff --git a/runtime/src/org/aspectj/runtime/reflect/StringMaker.java b/runtime/src/org/aspectj/runtime/reflect/StringMaker.java index e014defb4..a2a1122c0 100644 --- a/runtime/src/org/aspectj/runtime/reflect/StringMaker.java +++ b/runtime/src/org/aspectj/runtime/reflect/StringMaker.java @@ -26,6 +26,7 @@ class StringMaker { boolean includeJoinPointTypeName = true; boolean includeEnclosingPoint = true; boolean shortKindName = true; + int cacheOffset; static StringMaker shortStringMaker; static { @@ -39,6 +40,7 @@ class StringMaker { shortStringMaker.includeJoinPointTypeName = false; shortStringMaker.includeEnclosingPoint = false; + shortStringMaker.cacheOffset = 0; } static StringMaker middleStringMaker; @@ -49,6 +51,8 @@ class StringMaker { middleStringMaker.includeThrows = false; middleStringMaker.includeModifiers = false; middleStringMaker.shortPrimaryTypeNames = false; + + shortStringMaker.cacheOffset = 1; } static StringMaker longStringMaker; @@ -60,6 +64,8 @@ class StringMaker { longStringMaker.includeModifiers = true; longStringMaker.shortPrimaryTypeNames = false; longStringMaker.shortKindName = false; + + longStringMaker.cacheOffset = 2; } String makeKindName(String name) { diff --git a/runtime/testsrc/RuntimeModuleTests.java b/runtime/testsrc/RuntimeModuleTests.java index 61bc7a869..a5a4c0768 100644 --- a/runtime/testsrc/RuntimeModuleTests.java +++ b/runtime/testsrc/RuntimeModuleTests.java @@ -17,6 +17,7 @@ import java.io.*; import org.aspectj.lang.*; import org.aspectj.runtime.reflect.JoinPointImplTest; +import org.aspectj.runtime.reflect.RuntimePerformanceTest; import org.aspectj.runtime.reflect.SignatureTest; import junit.framework.*; @@ -27,7 +28,8 @@ public class RuntimeModuleTests extends TestCase { TestSuite suite = new TestSuite(RuntimeModuleTests.class.getName()); suite.addTestSuite(RuntimeModuleTests.class); // minimum 1 test (testNothing) suite.addTestSuite(SignatureTest.class); - suite.addTestSuite(JoinPointImplTest.class); + suite.addTestSuite(JoinPointImplTest.class); + suite.addTestSuite(RuntimePerformanceTest.class); return suite; } diff --git a/runtime/testsrc/org/aspectj/runtime/reflect/RuntimePerformanceTest.java b/runtime/testsrc/org/aspectj/runtime/reflect/RuntimePerformanceTest.java new file mode 100644 index 000000000..592bcd6a3 --- /dev/null +++ b/runtime/testsrc/org/aspectj/runtime/reflect/RuntimePerformanceTest.java @@ -0,0 +1,111 @@ +/******************************************************************************* + * Copyright (c) 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Matthew Webster - initial implementation + *******************************************************************************/ +package org.aspectj.runtime.reflect; + +import java.lang.reflect.Method; +import java.util.Timer; +import java.util.TimerTask; + +import org.aspectj.lang.Signature; + +import junit.framework.TestCase; + +public class RuntimePerformanceTest extends TestCase { + + private static final Timer timer = new Timer(true); + private static final long TIMEOUT = 10000; + private static final long ITERATIONS = 1000000; + private static final long WARMUP_ITERATIONS = 10000; + private static final long EXPECTED_RATIO = 10; + private static final Factory factory = new Factory("RutimePerformanceTest.java",RuntimePerformanceTest.class); + + private boolean savedUseCaches; + private Method method; + private Signature signature; + + private TimerTask task; + private boolean abort; + + public RuntimePerformanceTest(String name) { + super(name); + } + + protected void setUp() throws Exception { + super.setUp(); + + /* Save default state */ + savedUseCaches = SignatureImpl.getUseCache(); + + /* If a test takes too long we can kill it and fail */ + abort = false; + task = new TimerTask() { + public void run () { + abort = true; + } + }; + timer.schedule(task,TIMEOUT); + } + + protected void tearDown() throws Exception { + super.tearDown(); + + /* Restore default state */ + SignatureImpl.setUseCache(savedUseCaches); + + task.cancel(); + } + + public void testToString () { + Signature signature = makeMethodSig("test"); + + SignatureImpl.setUseCache(false); + warmUp(signature); + long noCache = invokeSignatureToString(signature,ITERATIONS/EXPECTED_RATIO); + System.out.println("noCache=" + noCache); + + SignatureImpl.setUseCache(true); + warmUp(signature); + long cache = invokeSignatureToString(signature,ITERATIONS); + System.out.println("cache=" + cache); + + long ratio = (EXPECTED_RATIO*noCache/cache); + System.out.println("ratio=" + ratio); + assertTrue("Using cache should be " + EXPECTED_RATIO + " times faster: " + ratio,(ratio > EXPECTED_RATIO)); + } + + private long invokeSignatureToString (Signature sig, long iterations) { + long start = System.currentTimeMillis(); + String s; + + for (long l = 0; !abort && (l < iterations); l++) { + s = sig.toShortString(); + s = sig.toString(); + s = sig.toLongString(); + } + if (abort) throw new RuntimeException("invokeSignatureToString aborted after " + (TIMEOUT/1000) + " seconds"); + + long finish = System.currentTimeMillis(); + return (finish-start); + } + + private void warmUp (Signature sig) { + invokeSignatureToString(sig,WARMUP_ITERATIONS); + } + + private Signature makeMethodSig (String methodName) { + Class clazz = getClass(); + Class[] parameterTypes = new Class[] { String.class }; + String[] parameterNames = new String[] { "s" }; + Class[] exceptionTypes = new Class[] {}; + Class returnType = Void.TYPE; + return factory.makeMethodSig(1,methodName,clazz,parameterTypes,parameterNames,exceptionTypes,returnType); + } +} \ No newline at end of file diff --git a/runtime/testsrc/org/aspectj/runtime/reflect/SignatureTest.java b/runtime/testsrc/org/aspectj/runtime/reflect/SignatureTest.java index b8170d649..533280fcd 100644 --- a/runtime/testsrc/org/aspectj/runtime/reflect/SignatureTest.java +++ b/runtime/testsrc/org/aspectj/runtime/reflect/SignatureTest.java @@ -20,4 +20,15 @@ public class SignatureTest extends TestCase { assertEquals(SignatureTest.class.getName(),fsi.getDeclaringTypeName()); assertSame(fsi.getDeclaringTypeName(),fsi.getDeclaringTypeName()); // should be cached. } + + public void testToShortMiddleLongString () { + MethodSignatureImpl msi = new MethodSignatureImpl(0,"test",SignatureTest.class,new Class[] { String.class, Integer.TYPE }, new String[] { "s", "i" }, new Class[] {}, Runnable.class); + String shortString = msi.toShortString(); + assertSame(shortString,msi.toShortString()); // should be cached. + String middleString = msi.toString(); + assertSame(middleString,msi.toString()); // should be cached. + String longString = msi.toLongString(); + assertSame(longString,msi.toLongString()); // should be cached. + assertTrue("String representations should be different",!(shortString.equals(middleString) || middleString.equals(longString) || longString.equals(shortString))); + } } -- 2.39.5