/* ******************************************************************* * Copyright (c) 2009 Contributors * All rights reserved. * This program and the accompanying materials are made available * under the terms of the Eclipse Public License v 2.0 * which accompanies this distribution and is available at * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt * * Contributors: * Andy Clement initial implementation * ******************************************************************/ package org.aspectj.weaver.patterns; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import org.aspectj.weaver.CompressingDataOutputStream; 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 (Member value : yes) { checkMatch(p, value, true); } for (Member member : no) { checkMatch(p, member, 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(); ConstantPoolSimulator cps = new ConstantPoolSimulator(); CompressingDataOutputStream out = new CompressingDataOutputStream(bo, cps); p.write(out); out.close(); ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); VersionedDataInputStream in = new VersionedDataInputStream(bi, cps); SignaturePattern newP = SignaturePattern.read(in, null); assertEquals("write/read", p, newP); } }