Ich habe die folgenden zwei Programme:Iteration Geschwindigkeit von int vs lange
long startTime = System.currentTimeMillis();
for (int i = 0; i < N; i++);
long endTime = System.currentTimeMillis();
System.out.println("Elapsed time: " + (endTime - startTime) + " msecs");
und
long startTime = System.currentTimeMillis();
for (long i = 0; i < N; i++);
long endTime = System.currentTimeMillis();
System.out.println("Elapsed time: " + (endTime - startTime) + " msecs");
Hinweis: Der einzige Unterschied ist die Art der Schleifenvariable ist (int
und long
).
Wenn ich dies ausführe, druckt das erste Programm konsistent zwischen 0 und 16 ms, unabhängig von dem Wert N
. Der zweite dauert viel länger. Für N == Integer.MAX_VALUE
läuft es in ungefähr 1800 msecs auf meiner Maschine. Die Laufzeit scheint in N
mehr oder weniger linear zu sein.
Also warum ist das?
Ich nehme an, der JIT-Compiler optimiert die int
Schleife zu Tode. Und das aus gutem Grund, denn offensichtlich tut es nichts. Aber warum tut es das auch nicht für die long
Schleife?
Ein Kollege dachte, wir könnten den JIT-Compiler messen, der seine Arbeit in der long
-Schleife ausführt, aber da die Laufzeit in N
linear zu sein scheint, ist dies wahrscheinlich nicht der Fall.
Ich bin mit JDK 1.6.0 Update 17:
C:\>java -version
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)
Ich bin auf Windows XP Professional x64 Edition, Service Pack 2, mit einem Intel Core 2 Quad CPU bei 2.40GHz.
HAFTUNGSAUSSCHLUSS
Ich weiß, dass in der Produktion nicht Microbenchmarks nützlich sind. Ich weiß auch, dass System.currentTimeMillis()
nicht so genau ist, wie sein Name vermuten lässt. Dies ist nur etwas, was mir beim Herumalbern aufgefallen ist, und ich war einfach neugierig, warum das passiert; nichts mehr.
ich absolut mit @Andrzej zustimmen hier, aber wenn es wirklich nur um ihrer selbst willen Neugier, Sie könnten das PrintAssembly-Plug-in verwenden, um sich den generierten Code anzusehen: http://wikis.sun.com/display/HotSpotInternals/PrintAssembly –
Was passiert, wenn Sie mit dem Flag -Xint arbeiten? Dies verhindert das Kompilieren von Hotspots, so dass Sie einen besseren Vergleich erhalten. –
@Steven: aber mit '-Xint' ist das Ergebnis * noch weniger * aussagekräftig für alles, was echt aussieht. –