]> source.dussan.org Git - aspectj.git/commitdiff
speed test
authoraclement <aclement>
Fri, 13 Nov 2009 18:23:12 +0000 (18:23 +0000)
committeraclement <aclement>
Fri, 13 Nov 2009 18:23:12 +0000 (18:23 +0000)
org.aspectj.matcher/testsrc/org/aspectj/weaver/patterns/SignaturePatternMatchSpeedTestCase.java [new file with mode: 0644]

diff --git a/org.aspectj.matcher/testsrc/org/aspectj/weaver/patterns/SignaturePatternMatchSpeedTestCase.java b/org.aspectj.matcher/testsrc/org/aspectj/weaver/patterns/SignaturePatternMatchSpeedTestCase.java
new file mode 100644 (file)
index 0000000..02058d8
--- /dev/null
@@ -0,0 +1,166 @@
+/* *******************************************************************
+ * Copyright (c) 2009 Contributors
+ * All rights reserved. 
+ * This program and the accompanying materials are made available 
+ * under the terms of the Eclipse Public License v1.0 
+ * which accompanies this distribution and is available at 
+ * http://www.eclipse.org/legal/epl-v10.html 
+ *  
+ * Contributors: 
+ *     Andy Clement     initial implementation 
+ * ******************************************************************/
+
+package org.aspectj.weaver.patterns;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+
+import org.aspectj.weaver.Member;
+import org.aspectj.weaver.TestUtils;
+import org.aspectj.weaver.VersionedDataInputStream;
+import org.aspectj.weaver.World;
+import org.aspectj.weaver.reflect.ReflectionWorld;
+
+public class SignaturePatternMatchSpeedTestCase extends PatternsTestCase {
+
+       Member stringReplaceFirstMethod;
+
+       @Override
+       public World getWorld() {
+               return new ReflectionWorld(true, this.getClass().getClassLoader());
+       }
+
+       public void testPatternEllipsis() throws IOException {
+               String pattern = "* *(..))";
+               SignaturePattern signaturePattern = toPattern(pattern);
+               warmup(signaturePattern, stringReplaceFirstMethod, world);
+               long time = measure(signaturePattern, stringReplaceFirstMethod, world);
+               System.out.println("Signature pattern [" + pattern + "] took " + time + "ms for 1,000,000");
+       }
+
+       public void testPatternOneArg() throws IOException {
+               String pattern = "* *(*))";
+               SignaturePattern signaturePattern = toPattern(pattern);
+               warmup(signaturePattern, stringReplaceFirstMethod, world);
+               long time = measure(signaturePattern, stringReplaceFirstMethod, world);
+               System.out.println("Signature pattern [" + pattern + "] took " + time + "ms for 1,000,000");
+       }
+
+       public void testPatternNoArgs() throws IOException {
+               String pattern = "* *())";
+               SignaturePattern signaturePattern = toPattern(pattern);
+               warmup(signaturePattern, stringReplaceFirstMethod, world);
+               long time = measure(signaturePattern, stringReplaceFirstMethod, world);
+               System.out.println("Signature pattern [" + pattern + "] took " + time + "ms for 1,000,000");
+       }
+
+       public void testPatternNotVoidReturn() throws IOException {
+               String pattern = "!void *(..))";
+               SignaturePattern signaturePattern = toPattern(pattern);
+               warmup(signaturePattern, stringReplaceFirstMethod, world);
+               long time = measure(signaturePattern, stringReplaceFirstMethod, world);
+               System.out.println("Signature pattern [" + pattern + "] took " + time + "ms for 1,000,000");
+       }
+
+       public void testPatternVoidReturn() throws IOException {
+               String pattern = "void *(..))";
+               SignaturePattern signaturePattern = toPattern(pattern);
+               warmup(signaturePattern, stringReplaceFirstMethod, world);
+               long time = measure(signaturePattern, stringReplaceFirstMethod, world);
+               System.out.println("Signature pattern [" + pattern + "] took " + time + "ms for 1,000,000");
+       }
+
+       public void testPatternWildcardedName() throws IOException {
+               String pattern = "* *a*b*()";
+               SignaturePattern signaturePattern = toPattern(pattern);
+               warmup(signaturePattern, stringReplaceFirstMethod, world);
+               long time = measure(signaturePattern, stringReplaceFirstMethod, world);
+               System.out.println("Signature pattern [" + pattern + "] took " + time + "ms for 1,000,000");
+       }
+
+       public void testPatternWildcardedName2() throws IOException {
+               String pattern = "* *a*b*(..)";
+               SignaturePattern signaturePattern = toPattern(pattern);
+               warmup(signaturePattern, stringReplaceFirstMethod, world);
+               long time = measure(signaturePattern, stringReplaceFirstMethod, world);
+               System.out.println("Signature pattern [" + pattern + "] took " + time + "ms for 1,000,000");
+       }
+
+       // ---
+
+       public void checkMatch(SignaturePattern p, Member[] yes, Member[] no) throws IOException {
+               p = p.resolveBindings(new TestScope(world, new FormalBinding[0]), new Bindings(0));
+
+               for (int i = 0; i < yes.length; i++) {
+                       checkMatch(p, yes[i], true);
+               }
+
+               for (int i = 0; i < no.length; i++) {
+                       checkMatch(p, no[i], false);
+               }
+
+               checkSerialization(p);
+       }
+
+       @Override
+       public void setUp() throws Exception {
+               super.setUp();
+               stringReplaceFirstMethod = TestUtils.methodFromString(
+                               "java.lang.String java.lang.String.replaceFirst(java.lang.String,java.lang.String)").resolve(world);
+       }
+
+       /**
+        * Run match 1000 times to warmup
+        */
+       private void warmup(SignaturePattern signaturePattern, Member method, World world) {
+               for (int i = 0; i < 1000; i++) {
+                       signaturePattern.matches(method, world, false);
+               }
+       }
+
+       /**
+        * Run match 1000000 and return time taken in ms
+        */
+       private long measure(SignaturePattern signaturePattern, Member method, World world) {
+               long stime = System.currentTimeMillis();
+               for (int i = 0; i < 1000000; i++) {
+                       signaturePattern.matches(method, world, false);
+               }
+               return (System.currentTimeMillis() - stime);
+       }
+
+       private SignaturePattern toPattern(String pattern) {
+               SignaturePattern signaturePattern = makeMethodPat(pattern);
+               signaturePattern = signaturePattern.resolveBindings(new TestScope(world, new FormalBinding[0]), new Bindings(0));
+               return signaturePattern;
+       }
+
+       private void checkMatch(SignaturePattern p, Member member, boolean b) {
+               boolean matches = p.matches(member, world, false);
+               assertEquals(p.toString() + " matches " + member.toString(), b, matches);
+       }
+
+       private SignaturePattern makeMethodPat(String pattern) {
+               return new PatternParser(pattern).parseMethodOrConstructorSignaturePattern();
+       }
+
+       private SignaturePattern makeFieldPat(String pattern) {
+               return new PatternParser(pattern).parseFieldSignaturePattern();
+       }
+
+       private void checkSerialization(SignaturePattern p) throws IOException {
+               ByteArrayOutputStream bo = new ByteArrayOutputStream();
+               DataOutputStream out = new DataOutputStream(bo);
+               p.write(out);
+               out.close();
+
+               ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
+               VersionedDataInputStream in = new VersionedDataInputStream(bi);
+               SignaturePattern newP = SignaturePattern.read(in, null);
+
+               assertEquals("write/read", p, newP);
+       }
+
+}