/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
class Hoge
{
public static int n = 0;
public static int m = 0;
public static int h = 0;
}
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
static final int NUM = 15;
static Foo[] sFoos;
Foo[] iFoos;
public static void main (String[] args) throws java.lang.Exception
{
Ideone io = new Ideone();
io.test();
}
void test() {
long t0, t1;
Ideone io = new Ideone();
Random rand = new Random();
Foo[] foos = new Foo[NUM];
foos[0] = new Foo0();
foos[1] = new Foo1();
foos[2] = new Foo2();
foos[3] = new Foo3();
foos[4] = new Foo4();
foos[5] = new Foo5();
foos[6] = new Foo6();
foos[7] = new Foo7();
foos[8] = new Foo8();
foos[9] = new Foo9();
foos[10] = new Foo10();
for (int i = 11; i < NUM; i++) {
foos[i] = foos[0];
}
sFoos = iFoos = io.iFoos = foos;
int[] indexes = new int[20000000];
for (int i = 0; i < indexes.length; i++) {
indexes[i] = rand.nextInt(NUM);
}
///////////////////////////////////////////
System.out.println("Local Variable Array");
t0 = System.currentTimeMillis();
for (int i = 0; i < indexes.length; i++) {
foos[indexes[i]].doit();
}
t1 = System.currentTimeMillis();
System.out.println(t1 + "-" + t0 + "=" + (t1 - t0));
///////////////////////////////////////////
System.out.println("Class Field Array"); Hoge.n = 0;
t0 = System.currentTimeMillis();
for (int i = 0; i < indexes.length; i++) {
sFoos[indexes[i]].doit();
}
t1 = System.currentTimeMillis();
System.out.println(t1 + "-" + t0 + "=" + (t1 - t0));
///////////////////////////////////////////
System.out.println("Instance(this) Field Array"); Hoge.n = 0;
t0 = System.currentTimeMillis();
for (int i = 0; i < indexes.length; i++) {
iFoos[indexes[i]].doit();
}
t1 = System.currentTimeMillis();
System.out.println(t1 + "-" + t0 + "=" + (t1 - t0));
///////////////////////////////////////////
System.out.println("Instance(local) Field Array"); Hoge.n = 0;
t0 = System.currentTimeMillis();
for (int i = 0; i < indexes.length; i++) {
io.iFoos[indexes[i]].doit();
}
t1 = System.currentTimeMillis();
System.out.println(t1 + "-" + t0 + "=" + (t1 - t0));
///////////////////////////////////////////
System.out.println("tableswitch");
t0 = System.currentTimeMillis();
for (int i = 0; i < indexes.length; i++) {
switch (indexes[i]) {
case 0:
case 11:
case 12:
case 13:
case 14:
foo0();
break;
case 1:
foo1();
break;
case 2:
foo2();
break;
case 3:
foo3();
break;
case 4:
foo4();
break;
case 5:
foo5();
break;
case 6:
foo6();
break;
case 7:
foo7();
break;
case 8:
foo8();
break;
case 9:
foo9();
break;
case 10:
foo10();
break;
}
}
t1 = System.currentTimeMillis();
System.out.println(t1 + "-" + t0 + "=" + (t1 - t0));
Hoge.m = Hoge.h;
///////////////////////////////////////////
for (int i = 0; i < indexes.length; i++) {
switch (indexes[i]) {
case 0: indexes[i] = 5; break;
case 1: indexes[i] = 101; break;
case 2: indexes[i] = 93; break;
case 3: indexes[i] = 4016; break;
case 4: indexes[i] = 880888; break;
case 5: indexes[i] = 41; break;
case 6: indexes[i] = 22; break;
case 7: indexes[i] = 330; break;
case 8: indexes[i] = 1010; break;
case 9: indexes[i] = 171; break;
case 10: indexes[i] = 999; break;
case 11: indexes[i] = 10010; break;
case 12: indexes[i] = 7521; break;
case 13: indexes[i] = 8; break;
case 14: indexes[i] = 76; break;
}
}
///////////////////////////////////////////
System.out.println("lookupswitch"); Hoge.h = 0;
t0 = System.currentTimeMillis();
for (int i = 0; i < indexes.length; i++) {
switch (indexes[i]) {
case 5:
case 10010:
case 7521:
case 8:
case 76:
foo0();
break;
case 101:
foo1();
break;
case 93:
foo2();
break;
case 4016:
foo3();
break;
case 880888:
foo4();
break;
case 41:
foo5();
break;
case 22:
foo6();
break;
case 330:
foo7();
break;
case 1010:
foo8();
break;
case 171:
foo9();
break;
case 999:
foo10();
break;
}
}
t1 = System.currentTimeMillis();
System.out.println(t1 + "-" + t0 + "=" + (t1 - t0));
///////////////////////////////////////////
System.out.println("check");
System.out.println(Hoge.n);
System.out.println(Hoge.m);
System.out.println(Hoge.h);
}
void foo0() { Hoge.h++; }
void foo1() { Hoge.h = (Hoge.h + 1) * 2; }
void foo2() { Hoge.h += 13; }
void foo3() { Hoge.h -= 4; }
void foo4() { Hoge.h *= 3; }
void foo5() { Hoge.h += Hoge.h % 17; }
void foo6() { Hoge.h /= 100; }
void foo7() { Hoge.h--; }
void foo8() { Hoge.h += 30; }
void foo9() { Hoge.h >>= 1; }
void foo10() { Hoge.h -= Hoge.h % 73; }
}
interface Foo
{
void doit();
}
class Foo0 implements Foo
{
public void doit() { Hoge.n++; }
}
class Foo1 implements Foo
{
public void doit() { Hoge.n = (Hoge.n + 1) * 2; }
}
class Foo2 implements Foo
{
public void doit() { Hoge.n += 13; }
}
class Foo3 implements Foo
{
public void doit() { Hoge.n -= 4; }
}
class Foo4 implements Foo
{
public void doit() { Hoge.n *= 3; }
}
class Foo5 implements Foo
{
public void doit() { Hoge.n += Hoge.n % 17; }
}
class Foo6 implements Foo
{
public void doit() { Hoge.n /= 100; }
}
class Foo7 implements Foo
{
public void doit() { Hoge.n--; }
}
class Foo8 implements Foo
{
public void doit() { Hoge.n += 30; }
}
class Foo9 implements Foo
{
public void doit() { Hoge.n >>= 1; }
}
class Foo10 implements Foo
{
public void doit() { Hoge.n -= Hoge.n % 73; }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBIb2dlCnsKCXB1YmxpYyBzdGF0aWMgaW50IG4gPSAwOwoJcHVibGljIHN0YXRpYyBpbnQgbSA9IDA7CglwdWJsaWMgc3RhdGljIGludCBoID0gMDsKfQoKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7CglzdGF0aWMgZmluYWwgaW50IE5VTSA9IAkxNTsKCQoJc3RhdGljIEZvb1tdIHNGb29zOwoJCglGb29bXSBpRm9vczsKCQoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkJSWRlb25lIGlvID0gbmV3IElkZW9uZSgpOwoJCQoJCWlvLnRlc3QoKTsKCX0KCQoJdm9pZCB0ZXN0KCkgewoJCWxvbmcgdDAsIHQxOwoJCQoJCUlkZW9uZSBpbyA9IG5ldyBJZGVvbmUoKTsKCQkKCQlSYW5kb20gcmFuZCA9IG5ldyBSYW5kb20oKTsKCQkKCQlGb29bXSBmb29zID0gbmV3IEZvb1tOVU1dOwoJCWZvb3NbMF0gPSBuZXcgRm9vMCgpOwoJCWZvb3NbMV0gPSBuZXcgRm9vMSgpOwoJCWZvb3NbMl0gPSBuZXcgRm9vMigpOwoJCWZvb3NbM10gPSBuZXcgRm9vMygpOwoJCWZvb3NbNF0gPSBuZXcgRm9vNCgpOwoJCWZvb3NbNV0gPSBuZXcgRm9vNSgpOwoJCWZvb3NbNl0gPSBuZXcgRm9vNigpOwoJCWZvb3NbN10gPSBuZXcgRm9vNygpOwoJCWZvb3NbOF0gPSBuZXcgRm9vOCgpOwoJCWZvb3NbOV0gPSBuZXcgRm9vOSgpOwoJCWZvb3NbMTBdID0gbmV3IEZvbzEwKCk7CgkJCgkJZm9yIChpbnQgaSA9IDExOyBpIDwgTlVNOyBpKyspIHsKCQkJZm9vc1tpXSA9IGZvb3NbMF07CgkJfQoJCQoJCXNGb29zID0gaUZvb3MgPSBpby5pRm9vcyA9IGZvb3M7CgkJCgkJaW50W10gaW5kZXhlcyA9IG5ldyBpbnRbMjAwMDAwMDBdOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhlcy5sZW5ndGg7IGkrKykgewoJCQlpbmRleGVzW2ldID0gcmFuZC5uZXh0SW50KE5VTSk7CgkJfQoJCQoJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCQkKCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2FsIFZhcmlhYmxlIEFycmF5Iik7CgkJdDAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4ZXMubGVuZ3RoOyBpKyspIHsKCQkJZm9vc1tpbmRleGVzW2ldXS5kb2l0KCk7CgkJfQoJCXQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKHQxICsgIi0iICsgdDAgKyAiPSIgKyAodDEgLSB0MCkpOwoKCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgoJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2xhc3MgRmllbGQgQXJyYXkiKTsgSG9nZS5uID0gMDsKCQl0MCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhlcy5sZW5ndGg7IGkrKykgewoJCQlzRm9vc1tpbmRleGVzW2ldXS5kb2l0KCk7CgkJfQoJCXQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKHQxICsgIi0iICsgdDAgKyAiPSIgKyAodDEgLSB0MCkpOwoJCQoJCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCQkKCQlTeXN0ZW0ub3V0LnByaW50bG4oIkluc3RhbmNlKHRoaXMpIEZpZWxkIEFycmF5Iik7IEhvZ2UubiA9IDA7CgkJdDAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4ZXMubGVuZ3RoOyBpKyspIHsKCQkJaUZvb3NbaW5kZXhlc1tpXV0uZG9pdCgpOwoJCX0KCQl0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoJCVN5c3RlbS5vdXQucHJpbnRsbih0MSArICItIiArIHQwICsgIj0iICsgKHQxIC0gdDApKTsKCgkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJCQoJCVN5c3RlbS5vdXQucHJpbnRsbigiSW5zdGFuY2UobG9jYWwpIEZpZWxkIEFycmF5Iik7IEhvZ2UubiA9IDA7CgkJdDAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4ZXMubGVuZ3RoOyBpKyspIHsKCQkJaW8uaUZvb3NbaW5kZXhlc1tpXV0uZG9pdCgpOwoJCX0KCQl0MSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoJCVN5c3RlbS5vdXQucHJpbnRsbih0MSArICItIiArIHQwICsgIj0iICsgKHQxIC0gdDApKTsKCQkKCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkJCQkKCQlTeXN0ZW0ub3V0LnByaW50bG4oInRhYmxlc3dpdGNoIik7CgkJdDAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4ZXMubGVuZ3RoOyBpKyspIHsKCQkJc3dpdGNoIChpbmRleGVzW2ldKSB7CgkJCWNhc2UgMDoKCQkJY2FzZSAxMToKCQkJY2FzZSAxMjoKCQkJY2FzZSAxMzoKCQkJY2FzZSAxNDoKCQkJCWZvbzAoKTsKCQkJCWJyZWFrOwoJCQljYXNlIDE6CgkJCQlmb28xKCk7CgkJCQlicmVhazsKCQkJY2FzZSAyOgoJCQkJZm9vMigpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMzoKCQkJCWZvbzMoKTsKCQkJCWJyZWFrOwoJCQljYXNlIDQ6CgkJCQlmb280KCk7CgkJCQlicmVhazsKCQkJY2FzZSA1OgoJCQkJZm9vNSgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgNjoKCQkJCWZvbzYoKTsKCQkJCWJyZWFrOwoJCQljYXNlIDc6CgkJCQlmb283KCk7CgkJCQlicmVhazsKCQkJY2FzZSA4OgoJCQkJZm9vOCgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgOToKCQkJCWZvbzkoKTsKCQkJCWJyZWFrOwoJCQljYXNlIDEwOgoJCQkJZm9vMTAoKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKHQxICsgIi0iICsgdDAgKyAiPSIgKyAodDEgLSB0MCkpOwoJCUhvZ2UubSA9IEhvZ2UuaDsKCgkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoJCQoJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhlcy5sZW5ndGg7IGkrKykgewoJCQlzd2l0Y2ggKGluZGV4ZXNbaV0pIHsKCQkJY2FzZSAwOiBpbmRleGVzW2ldID0gNTsgYnJlYWs7CgkJCWNhc2UgMTogaW5kZXhlc1tpXSA9IDEwMTsgYnJlYWs7CgkJCWNhc2UgMjogaW5kZXhlc1tpXSA9IDkzOyBicmVhazsKCQkJY2FzZSAzOiBpbmRleGVzW2ldID0gNDAxNjsgYnJlYWs7CgkJCWNhc2UgNDogaW5kZXhlc1tpXSA9IDg4MDg4ODsgYnJlYWs7CgkJCWNhc2UgNTogaW5kZXhlc1tpXSA9IDQxOyBicmVhazsKCQkJY2FzZSA2OiBpbmRleGVzW2ldID0gMjI7IGJyZWFrOwoJCQljYXNlIDc6IGluZGV4ZXNbaV0gPSAzMzA7IGJyZWFrOwoJCQljYXNlIDg6IGluZGV4ZXNbaV0gPSAxMDEwOyBicmVhazsKCQkJY2FzZSA5OiBpbmRleGVzW2ldID0gMTcxOyBicmVhazsKCQkJY2FzZSAxMDogaW5kZXhlc1tpXSA9IDk5OTsgYnJlYWs7CgkJCWNhc2UgMTE6IGluZGV4ZXNbaV0gPSAxMDAxMDsgYnJlYWs7CgkJCWNhc2UgMTI6IGluZGV4ZXNbaV0gPSA3NTIxOyBicmVhazsKCQkJY2FzZSAxMzogaW5kZXhlc1tpXSA9IDg7IGJyZWFrOwoJCQljYXNlIDE0OiBpbmRleGVzW2ldID0gNzY7IGJyZWFrOwoJCQl9CgkJfQoKCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkJCgkJU3lzdGVtLm91dC5wcmludGxuKCJsb29rdXBzd2l0Y2giKTsgSG9nZS5oID0gMDsKCQl0MCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhlcy5sZW5ndGg7IGkrKykgewoJCQlzd2l0Y2ggKGluZGV4ZXNbaV0pIHsKCQkJY2FzZSA1OgoJCQljYXNlIDEwMDEwOgoJCQljYXNlIDc1MjE6CgkJCWNhc2UgODoKCQkJY2FzZSA3NjoKCQkJCWZvbzAoKTsKCQkJCWJyZWFrOwoJCQljYXNlIDEwMToKCQkJCWZvbzEoKTsKCQkJCWJyZWFrOwoJCQljYXNlIDkzOgoJCQkJZm9vMigpOwoJCQkJYnJlYWs7CgkJCWNhc2UgNDAxNjoKCQkJCWZvbzMoKTsKCQkJCWJyZWFrOwoJCQljYXNlIDg4MDg4ODoKCQkJCWZvbzQoKTsKCQkJCWJyZWFrOwoJCQljYXNlIDQxOgoJCQkJZm9vNSgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjI6CgkJCQlmb282KCk7CgkJCQlicmVhazsKCQkJY2FzZSAzMzA6CgkJCQlmb283KCk7CgkJCQlicmVhazsKCQkJY2FzZSAxMDEwOgoJCQkJZm9vOCgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTcxOgoJCQkJZm9vOSgpOwoJCQkJYnJlYWs7CgkJCWNhc2UgOTk5OgoJCQkJZm9vMTAoKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXQxID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CgkJU3lzdGVtLm91dC5wcmludGxuKHQxICsgIi0iICsgdDAgKyAiPSIgKyAodDEgLSB0MCkpOwoKCQkvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgkJCgkJU3lzdGVtLm91dC5wcmludGxuKCJjaGVjayIpOwoJCQoJCVN5c3RlbS5vdXQucHJpbnRsbihIb2dlLm4pOwoJCVN5c3RlbS5vdXQucHJpbnRsbihIb2dlLm0pOwoJCVN5c3RlbS5vdXQucHJpbnRsbihIb2dlLmgpOwoJfQoJCgl2b2lkIGZvbzAoKSB7IEhvZ2UuaCsrOyB9Cgl2b2lkIGZvbzEoKSB7IEhvZ2UuaCA9IChIb2dlLmggKyAxKSAqIDI7IH0KCXZvaWQgZm9vMigpIHsgSG9nZS5oICs9IDEzOyB9Cgl2b2lkIGZvbzMoKSB7IEhvZ2UuaCAtPSA0OyB9Cgl2b2lkIGZvbzQoKSB7IEhvZ2UuaCAqPSAzOyB9Cgl2b2lkIGZvbzUoKSB7IEhvZ2UuaCArPSBIb2dlLmggJSAxNzsgfQoJdm9pZCBmb282KCkgeyBIb2dlLmggLz0gMTAwOyB9Cgl2b2lkIGZvbzcoKSB7IEhvZ2UuaC0tOyB9Cgl2b2lkIGZvbzgoKSB7IEhvZ2UuaCArPSAzMDsgfQoJdm9pZCBmb285KCkgeyBIb2dlLmggPj49IDE7IH0KCXZvaWQgZm9vMTAoKSB7IEhvZ2UuaCAtPSBIb2dlLmggJSA3MzsgfQp9CgppbnRlcmZhY2UgRm9vCnsKCXZvaWQgZG9pdCgpOwp9CgpjbGFzcyBGb28wIGltcGxlbWVudHMgRm9vCnsKCXB1YmxpYyB2b2lkIGRvaXQoKSB7IEhvZ2UubisrOyB9Cn0KCmNsYXNzIEZvbzEgaW1wbGVtZW50cyBGb28KewoJcHVibGljIHZvaWQgZG9pdCgpIHsgSG9nZS5uID0gKEhvZ2UubiArIDEpICogMjsgfQp9CgpjbGFzcyBGb28yIGltcGxlbWVudHMgRm9vCnsKCXB1YmxpYyB2b2lkIGRvaXQoKSB7IEhvZ2UubiArPSAxMzsgfQp9CgpjbGFzcyBGb28zIGltcGxlbWVudHMgRm9vCnsKCXB1YmxpYyB2b2lkIGRvaXQoKSB7IEhvZ2UubiAtPSA0OyB9Cn0KCmNsYXNzIEZvbzQgaW1wbGVtZW50cyBGb28KewoJcHVibGljIHZvaWQgZG9pdCgpIHsgSG9nZS5uICo9IDM7IH0KfQoKY2xhc3MgRm9vNSBpbXBsZW1lbnRzIEZvbwp7CglwdWJsaWMgdm9pZCBkb2l0KCkgeyBIb2dlLm4gKz0gSG9nZS5uICUgMTc7IH0KfQoKY2xhc3MgRm9vNiBpbXBsZW1lbnRzIEZvbwp7CglwdWJsaWMgdm9pZCBkb2l0KCkgeyBIb2dlLm4gLz0gMTAwOyB9Cn0KCmNsYXNzIEZvbzcgaW1wbGVtZW50cyBGb28KewoJcHVibGljIHZvaWQgZG9pdCgpIHsgSG9nZS5uLS07IH0KfQoKY2xhc3MgRm9vOCBpbXBsZW1lbnRzIEZvbwp7CglwdWJsaWMgdm9pZCBkb2l0KCkgeyBIb2dlLm4gKz0gMzA7IH0KfQoKY2xhc3MgRm9vOSBpbXBsZW1lbnRzIEZvbwp7CglwdWJsaWMgdm9pZCBkb2l0KCkgeyBIb2dlLm4gPj49IDE7IH0KfQoKY2xhc3MgRm9vMTAgaW1wbGVtZW50cyBGb28KewoJcHVibGljIHZvaWQgZG9pdCgpIHsgSG9nZS5uIC09IEhvZ2UubiAlIDczOyB9Cn0=