Gibt es einen Unterschied in der Laufzeit der folgenden zwei Schnipsel?gibt es einen Unterschied in der Laufzeit der folgenden:
SNIPPET 1:
for (Object obj : collection) {
step1(obj);
step2(obj);
step3(obj);
}
SNIPPET 2:
for (Object obj : collection) {
step1(obj);
}
for (Object obj : collection) {
step2(obj);
}
for (Object obj : collection) {
step3(obj);
}
Abhängig von der Implementierung von 'step1',' step2' und 'step3', kompiliert der Compiler die letztere zu demselben (Byte) Code wie der erstere. Aber, warum tust du es nicht selbst? – Stephan202
Nein, würde es nicht. Die Anrufe werden in unterschiedlichen Aufträgen getätigt. Wenn Objekte a, b, c usw. sind. Die Aufrufe sind a1, a2, a3, b1, b2, b3 usw. im ersten Beispiel, aber sie sind a1, b1, a2, b2, a3, c3 im zweiten Beispiel. – FogleBird
Sie haben das gleiche Big-O, aber im Gegensatz zu den meisten nachfolgenden Ansprüchen ist es unmöglich zu wissen, welche zur Laufzeit schneller sind, ohne zu wissen, was step1, step2 und step3 tun. Es gibt Code-Cache-Kohärenz, Daten-Cache-Kohärenz, Genauigkeit der Verzweigungsvorhersage ... eine beliebige Anzahl von Dingen, die die Laufzeitleistung verändern können. Timing es selbst ist die einzige Möglichkeit zu "wissen", und trotzdem sind die Ergebnisse immer noch spezifisch für Ihre Hardware. –