/************************************************************************************** * Copyright (c) Jonas Bon�r, Alexandre Vasseur. All rights reserved. * * http://aspectwerkz.codehaus.org * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the LGPL license * * a copy of which has been included with this distribution in the license.txt file. * **************************************************************************************/ package test.performance; import junit.framework.TestCase; /** * A so far VERY limited bench. <p/>Only tests the overhead of one around advice and one introduced * method. * * @author <a href="mailto:jboner@codehaus.org">Jonas Bon�r </a> * @TODO: extends this test case to be more interesting or replace with a real bench * @TODO: should add some more around advice, since JIT really shines when we have advice chains */ public class PerformanceTest extends TestCase { private boolean m_printInfo = true; private int m_numberOfInvocations = 100000000; public PerformanceTest(String name) { super(name); } public void testNonAdvisedMethodPerformance() { long startTime = System.currentTimeMillis(); for (int i = 0; i < m_numberOfInvocations; i++) { nonAdvisedMethod(); } long time = System.currentTimeMillis() - startTime; double timePerInvocationNormalMethod = time / (double) m_numberOfInvocations; if (m_printInfo) { System.out.println("\nNon advised method: " + timePerInvocationNormalMethod); } } public void testAroundAdvicePerJVMPerformance() { methodAdvisedMethodPerJVM(); long startTime = System.currentTimeMillis(); for (int i = 0; i < m_numberOfInvocations; i++) { nonAdvisedMethod(); } long time = System.currentTimeMillis() - startTime; double timePerInvocationNormalMethod = time / (double) m_numberOfInvocations; startTime = System.currentTimeMillis(); for (int i = 0; i < m_numberOfInvocations; i++) { methodAdvisedMethodPerJVM(); } time = System.currentTimeMillis() - startTime; double timePerInvocation = time / (double) m_numberOfInvocations; double overhead = timePerInvocation - timePerInvocationNormalMethod; if (m_printInfo) { System.out.println("\nPER_JVM advice: " + overhead); } } public void testAroundAdvicePerClassPerformance() { methodAdvisedMethodPerClass(); long startTime = System.currentTimeMillis(); for (int i = 0; i < m_numberOfInvocations; i++) { nonAdvisedMethod(); } long time = System.currentTimeMillis() - startTime; double timePerInvocationNormalMethod = time / (double) m_numberOfInvocations; startTime = System.currentTimeMillis(); for (int i = 0; i < m_numberOfInvocations; i++) { methodAdvisedMethodPerClass(); } time = System.currentTimeMillis() - startTime; double timePerInvocation = time / (double) m_numberOfInvocations; double overhead = timePerInvocation - timePerInvocationNormalMethod; if (m_printInfo) { System.out.println("\nPER_CLASS advice: " + overhead); } } public void testAroundAdvicePerInstancePerformance() { methodAdvisedMethodPerInstance(); long startTime = System.currentTimeMillis(); for (int i = 0; i < m_numberOfInvocations; i++) { nonAdvisedMethod(); } long time = System.currentTimeMillis() - startTime; double timePerInvocationNormalMethod = time / (double) m_numberOfInvocations; startTime = System.currentTimeMillis(); for (int i = 0; i < m_numberOfInvocations; i++) { methodAdvisedMethodPerInstance(); } time = System.currentTimeMillis() - startTime; double timePerInvocation = time / (double) m_numberOfInvocations; double overhead = timePerInvocation - timePerInvocationNormalMethod; if (m_printInfo) { System.out.println("\nPER_INSTANCE advice: " + overhead); } } public void testAroundAdvicePerThreadPerformance() { methodAdvisedMethodPerThread(); long startTime = System.currentTimeMillis(); for (int i = 0; i < m_numberOfInvocations; i++) { nonAdvisedMethod(); } long time = System.currentTimeMillis() - startTime; double timePerInvocationNormalMethod = time / (double) m_numberOfInvocations; startTime = System.currentTimeMillis(); for (int i = 0; i < m_numberOfInvocations; i++) { methodAdvisedMethodPerThread(); } time = System.currentTimeMillis() - startTime; double timePerInvocation = time / (double) m_numberOfInvocations; double overhead = timePerInvocation - timePerInvocationNormalMethod; if (m_printInfo) { System.out.println("\nPER_THREAD advice: " + overhead); } } public void testIntroductionPerJVMPerformance() { long startTime = System.currentTimeMillis(); PerJVM perJVM = (PerJVM) this; for (int i = 0; i < m_numberOfInvocations; i++) { perJVM.runPerJVM(); } long time = System.currentTimeMillis() - startTime; double timePerInvocation = time / (double) m_numberOfInvocations; if (m_printInfo) { System.out.println("\nPER_JVM introduction: " + timePerInvocation); } } public void testIntroductionPerClassPerformance() { long startTime = System.currentTimeMillis(); PerClass perClass = (PerClass) this; for (int i = 0; i < m_numberOfInvocations; i++) { perClass.runPerClass(); } long time = System.currentTimeMillis() - startTime; double timePerInvocation = time / (double) m_numberOfInvocations; if (m_printInfo) { System.out.println("\nPER_CLASS introduction: " + timePerInvocation); } } public void testIntroductionPerInstancePerformance() { long startTime = System.currentTimeMillis(); PerInstance perInstance = (PerInstance) this; for (int i = 0; i < m_numberOfInvocations; i++) { perInstance.runPerInstance(); } long time = System.currentTimeMillis() - startTime; double timePerInvocation = time / (double) m_numberOfInvocations; if (m_printInfo) { System.out.println("\nPER_INSTANCE introduction: " + timePerInvocation); } } public void testIntroductionPerThreadPerformance() { long startTime = System.currentTimeMillis(); PerThread perThread = (PerThread) this; for (int i = 0; i < m_numberOfInvocations; i++) { perThread.runPerThread(); } long time = System.currentTimeMillis() - startTime; double timePerInvocation = time / (double) m_numberOfInvocations; if (m_printInfo) { System.out.println("\nPER_THREAD introduction: " + timePerInvocation); } } public static void main(String[] args) { junit.textui.TestRunner.run(suite()); } public static junit.framework.Test suite() { return new junit.framework.TestSuite(PerformanceTest.class); } // ==== methods to test ==== public void nonAdvisedMethod() { } public void preAdvisedMethodPerJVM() { } public void preAdvisedMethodPerClass() { } public void preAdvisedMethodPerInstance() { } public void preAdvisedMethodPerThread() { } public void methodAdvisedMethodPerJVM() { } public void methodAdvisedMethodPerClass() { } public void methodAdvisedMethodPerInstance() { } public void methodAdvisedMethodPerThread() { } public void methodAdvisedMethodNoAdvice() { } }