blob: 046e49b69202f00923017e6f03472c2d12cc1dd5 [file] [log] [blame]
/*
* Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0,
* or the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
*/
// Contributors:
// Oracle - initial API and implementation from Oracle TopLink
package org.eclipse.persistence.testing.tests.performance.java;
import java.lang.reflect.Method;
import org.eclipse.persistence.testing.framework.*;
/**
* This test compares the performance for final, synchronized and normal method execution.
*/
public class MethodTest extends PerformanceComparisonTestCase {
protected int index = 0;
public MethodTest() {
setName("MethodExecution vs SynchronizedMethod PerformanceComparisonTest");
setDescription("This test compares the performance for final, synchronized and normal method execution.");
addSynchronizedTest();
addSynchronizedBlockTest();
addFinalTest();
addReflectionTest();
addInlinedTest();
addNormalTest();
addNormalTest2();
addNormalTest3();
addVolatileTest();
}
/**
* Normal.
*/
@Override
public void test() throws Throwable {
for (int index = 0; index < 100; index++) {
doTest();
}
}
/**
* Normal.
*/
public void doTest() {
// Do something simple.
index = index + 10;
if (index > 1000) {
index = 0;
}
}
/**
* Synchronized.
*/
public void addSynchronizedTest() {
PerformanceComparisonTestCase test = new PerformanceComparisonTestCase() {
protected int index2 = 0;
@Override
public void test() {
for (int index = 0; index < 100; index++) {
doTest();
}
}
public synchronized void doTest() {
// Do something simple.
index2 = index2 + 10;
if (index2 > 1000) {
index2 = 0;
}
}
};
test.setName("SynchronizedTest");
test.setAllowableDecrease(-10);
addTest(test);
}
/**
* Synchronized block.
*/
public void addSynchronizedBlockTest() {
PerformanceComparisonTestCase test = new PerformanceComparisonTestCase() {
protected int index2 = 0;
@Override
public void test() {
for (int index = 0; index < 100; index++) {
doTest();
}
}
public void doTest() {
synchronized (this) {
// Do something simple.
index2 = index2 + 10;
if (index2 > 1000) {
index2 = 0;
}
}
}
};
test.setName("SynchronizedBlockTest");
addTest(test);
}
/**
* Final.
*/
public void addFinalTest() {
PerformanceComparisonTestCase test = new PerformanceComparisonTestCase() {
protected int index2 = 0;
@Override
public final void test() {
for (int index = 0; index < 100; index++) {
doTest();
}
}
public final void doTest() {
// Do something simple.
index2 = index2 + 10;
if (index2 > 1000) {
index2 = 0;
}
}
};
test.setName("FinalTest");
addTest(test);
}
/**
* Reflection.
*/
public void addReflectionTest() {
PerformanceComparisonTestCase test = new PerformanceComparisonTestCase() {
protected int index2 = 0;
public Method method;
public Object[] args;
/**
* Allows any test specific setup before starting the test run.
*/
@Override
public void startTest() {
if (method == null) {
Class<?>[] argTypes = { };
try {
method = getClass().getMethod("doTest", argTypes);
} catch (Exception ignore) {
throw new RuntimeException(ignore);
}
args = new Object[0];
}
}
@Override
public final void test() {
for (int index = 0; index < 100; index++) {
try {
method.invoke(this, args);
} catch (Exception ignore) {
throw new RuntimeException(ignore);
}
}
}
public void doTest() {
// Do something simple.
index2 = index2 + 10;
if (index2 > 1000) {
index2 = 0;
}
}
};
test.setName("ReflectionTest");
addTest(test);
}
/**
* Inlined.
*/
public void addInlinedTest() {
PerformanceComparisonTestCase test = new PerformanceComparisonTestCase() {
protected int index2 = 0;
@Override
public void test() {
for (int index = 0; index < 100; index++) {
// Do something simple.
index2 = index2 + 10;
if (index2 > 1000) {
index2 = 0;
}
}
}
};
test.setName("InlinedTest");
addTest(test);
}
/**
* Normal.
*/
public void addNormalTest() {
PerformanceComparisonTestCase test = new PerformanceComparisonTestCase() {
@Override
public void test() {
for (int index = 0; index < 100; index++) {
doTest();
}
}
public void doTest() {
// Do something simple.
index = index + 10;
if (index > 1000) {
index = 0;
}
}
};
test.setName("NormalTest");
addTest(test);
}
/**
* Normal.
*/
public void addNormalTest2() {
PerformanceComparisonTestCase test = new PerformanceComparisonTestCase() {
@Override
public void test() {
for (int index = 0; index < 100; index++) {
MethodTest.this.doTest();
}
}
};
test.setName("NormalTest2");
addTest(test);
}
/**
* Normal.
*/
public void addNormalTest3() {
PerformanceComparisonTestCase test = new PerformanceComparisonTestCase() {
protected int index2 = 0;
@Override
public void test() {
for (int index = 0; index < 100; index++) {
doTest();
}
}
public void doTest() {
// Do something simple.
index2 = index2 + 10;
if (index2 > 1000) {
index2 = 0;
}
}
};
test.setName("NormalTest3");
addTest(test);
}
/**
* Volatile.
*/
public void addVolatileTest() {
PerformanceComparisonTestCase test = new PerformanceComparisonTestCase() {
protected volatile int index2 = 0;
@Override
public void test() {
for (int index = 0; index < 100; index++) {
doTest();
}
}
public void doTest() {
// Do something simple.
index2 = index2 + 10;
if (index2 > 1000) {
index2 = 0;
}
}
};
test.setName("VolatileTest");
addTest(test);
}
}