Eigentlich war mir die Tatsache, dass Methodenaufrufe über interfaces theoretisch etwas langsamer sind, schon bewußt ("Function Pointer Table", virtuelle Aufrufe und so...). Aber in einem bestimmten Fall ist das bei mir jetzt so deutlich zum Tragen gekommen, dass ich mal diesen Microbenchmark gebaut habe. Die sind natürlich immer mit Vorsicht zu genießen, aber es scheint (auch in dem anderen Programm) so dass bei sowas wie
ein Aufruf von
testInterface.method();
tatsächlich etwa 25% langsamer ist als ein Aufruf von
((TestClass)testInterface).method();
Hm. Blöd, irgendwie...
Code:
interface TestInterface
{
int get();
}
class TestClass implements TestInterface
{
private int n = 123;
public int get() { return n; }
}
ein Aufruf von
testInterface.method();
tatsächlich etwa 25% langsamer ist als ein Aufruf von
((TestClass)testInterface).method();
Hm. Blöd, irgendwie...
Code:
interface TestInterface
{
int get();
}
class TestClass implements TestInterface
{
private int n = 123;
public int get() { return n; }
}
class InterfaceSpeedTest
{
public static void main(String args[])
{
TestInterface data[] = createData(50000);
for (int runs=1000; runs<=100000; runs*=10)
{
runInterface(data, runs);
runClass(data, runs);
}
}
private static TestInterface[] createData(int size)
{
TestInterface data[] = new TestInterface[size];
for (int i=0; i<data.length; i++)
{
data[i] = new TestClass();
}
return data;
}
private static void runInterface(TestInterface data[], int runs)
{
int sum = 0;
long before = System.currentTimeMillis();
for (int i=0; i<runs; i++)
{
sum += runInterface(data);
}
long after = System.currentTimeMillis();
System.out.println(sum+" "+runs+" interface "+(after-before));
}
private static int runInterface(TestInterface data[])
{
int sum = 0;
for (int i=0; i<data.length; i++)
{
sum += data[i].get();
}
return sum;
}
private static void runClass(TestInterface data[], int runs)
{
int sum = 0;
long before = System.currentTimeMillis();
for (int i=0; i<runs; i++)
{
sum += runClass(data);
}
long after = System.currentTimeMillis();
System.out.println(sum+" "+runs+" class "+(after-before));
}
private static int runClass(TestInterface data[])
{
int sum = 0;
for (int i=0; i<data.length; i++)
{
sum += ((TestClass)data[i]).get();
}
return sum;
}
}