package nebula.simpletemplate;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import junit.framework.TestCase;
public class testMethodCallPerfomance extends TestCase {
public void testMethodCall() throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Person p = new Person();
p.setName("wangshilian");
Method m = p.getClass().getMethod("getName");
String name = (String) m.invoke(p);
assertEquals("wangshilian", name);
int MAX = 1000 * 1000;
{
String desc = "invoke";
// setUp
// prepare
long start, end, nanoAll, nanoEvery;
start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
name = (String) m.invoke(p);
}
end = System.nanoTime();
nanoAll = end - start;
nanoEvery = nanoAll / MAX;
System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery,
1000 * 1000 * 1000 / nanoEvery);
}
{
String desc = "get field";
// setUp
// prepare
long start, end, nanoAll, nanoEvery;
start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
name = p.getName();
}
end = System.nanoTime();
nanoAll = end - start;
nanoEvery = nanoAll / MAX;
System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery,
1000 * 1000 * 1000 / nanoEvery);
}
{
String desc = "delegate call";
// setUp
Map<String, Call> calls = new HashMap<String, testMethodCallPerfomance.Call>();
Call call = new Call() {
@Override
public Object call(Object obj) {
return ((Person) obj).getName();
}
};
calls.put("name", call);
calls.put("dsf", call);
calls.put("sadfdsfsa", call);
calls.put("dd", call);
calls.put("asdf", call);
calls.put("xcs", call);
calls.put("sadsad", call);
// prepare
long start, end, nanoAll, nanoEvery;
start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
name = (String) call.call(p);
}
end = System.nanoTime();
nanoAll = end - start;
nanoEvery = nanoAll / MAX;
System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery,
1000 * 1000 * 1000 / nanoEvery);
}
{
String desc = "new class";
// setUp
// prepare
long start, end, nanoAll, nanoEvery;
start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
// name = (String) new Caller().call(p);
new Caller();
}
end = System.nanoTime();
nanoAll = end - start;
nanoEvery = nanoAll / MAX;
System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery,
1000 * 1000 * 1000 / nanoEvery);
}
{
String desc = "new call";
// setUp
// prepare
long start, end, nanoAll, nanoEvery;
start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
name = (String) new Caller().call(p);
}
end = System.nanoTime();
nanoAll = end - start;
nanoEvery = nanoAll / MAX;
System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery,
1000 * 1000 * 1000 / nanoEvery);
}
{
String desc = "static instance call";
// setUp
// prepare
long start, end, nanoAll, nanoEvery;
start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
// name = (String) new Caller().call(p);
Caller.instance.call(p);
}
end = System.nanoTime();
nanoAll = end - start;
nanoEvery = nanoAll / MAX;
System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery,
1000 * 1000 * 1000 / nanoEvery);
}
{
String desc = "map get";
// setUp
Map<String, String> calls = new HashMap<String, String>();
calls.put("name", "wangshilian");
calls.put("dsf", "wangshilian");
calls.put("sadfdsfsa", "wangshilian");
calls.put("dd", "wangshilian");
calls.put("asdf", "wangshilian");
calls.put("xcs", "wangshilian");
calls.put("sadsad", "wangshilian");
// prepare
long start, end, nanoAll, nanoEvery;
start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
name = calls.get("name");
}
end = System.nanoTime();
nanoAll = end - start;
nanoEvery = nanoAll / MAX;
System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery,
1000 * 1000 * 1000 / nanoEvery);
}
{
String desc = "map get call";
// setUp
Map<String, Call> calls = new HashMap<String, testMethodCallPerfomance.Call>();
Call call = new Call() {
@Override
public Object call(Object obj) {
return ((Person) obj).getName();
}
};
calls.put("name", call);
calls.put("dsf", call);
calls.put("sadfdsfsa", call);
calls.put("dd", call);
calls.put("asdf", call);
calls.put("xcs", call);
calls.put("sadsad", call);
// prepare
long start, end, nanoAll, nanoEvery;
start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
name = (String) calls.get("name").call(p);
}
end = System.nanoTime();
nanoAll = end - start;
nanoEvery = nanoAll / MAX;
System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery,
1000 * 1000 * 1000 / nanoEvery);
}
{
String desc = "nop";
// setUp
// prepare
long start, end, nanoAll, nanoEvery;
start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
i = i + 1;
i = i - 1;
}
end = System.nanoTime();
nanoAll = end - start;
nanoEvery = nanoAll / MAX;
System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery,
1000 * 1000 * 1000 / nanoEvery);
}
{
String desc = "getClass";
// setUp
// prepare
long start, end, nanoAll, nanoEvery;
@SuppressWarnings("unused")
Class<?> z = null;
start = System.nanoTime();
for (int i = 0; i < MAX; i++) {
z = desc.getClass();
}
end = System.nanoTime();
nanoAll = end - start;
nanoEvery = nanoAll / MAX;
System.out.printf("[ %-20s ] All :%8d ms; every : %8d nano; one second : %8d times;\n", desc, (nanoAll / (1000 * 1000)), +nanoEvery,
1000 * 1000 * 1000 / nanoEvery);
}
}
interface Call {
Object call(Object obj);
}
static class Caller implements Call {
static Call instance = new Caller();
@Override
public Object call(Object obj) {
return ((Person) obj).getName();
}
};
}