Betrachtet man die folgenden Testprogramme:Warum macht Dereferenzierung mein Programm schneller?
int main(void) {
int iterations = 1000000000;
while (iterations > 0)
-- iterations;
}
Loop value on the stack (dereferenced)
int main(void) {
int iterations = 1000000000;
int * p = & iterations;
while (* p > 0)
-- * p;
}
#include <stdlib.h>
int main(void) {
int * p = malloc(sizeof(int));
* p = 1000000000;
while (*p > 0)
-- * p;
}
von ihnen mit -O0 kompilieren, erhalte ich t er folgende Ausführungszeiten:
case1.c
real 0m2.698s
user 0m2.690s
sys 0m0.003s
case2.c
real 0m2.574s
user 0m2.567s
sys 0m0.000s
case3.c
real 0m2.566s
user 0m2.560s
sys 0m0.000s
[Bearbeiten] Im Folgenden ist der Durchschnitt auf 10 Ausführungen:
case1.c
2.70364
case2.c
2.57091
case3.c
2.57000
Warum ist die Ausführungszeit größer mit dem ersten Testfall, der die einfachste zu sein scheint?
Meine aktuelle Architektur ist eine x86 virtuelle Maschine (Archlinux). Ich erhalte diese Ergebnisse sowohl mit gcc (4.8.0) als auch mit clang (3.3).
[Bearbeiten 1] Generierte Assembler-Codes sind fast identisch, außer dass die zweite und die dritte Anweisung mehr Befehle haben als die erste.
[Bearbeiten 2] Diese Leistungen sind reproduzierbar (auf meinem System). Jede Ausführung hat die gleiche Größenordnung.
[Bearbeiten] Ich interessiere mich nicht wirklich für die Leistung eines nicht optimierten Programms, aber ich verstehe nicht, warum es langsamer wäre, und ich bin neugierig.
Haben Sie versucht, den generierten Code zu sehen? Warum interessieren Sie sich überhaupt für die Leistung von nicht optimiertem Code? –
Hae, du hast versucht, sie in einer anderen Reihenfolge zu führen? Sind diese Single-Shot-Zeiten oder Durchschnittswerte über eine beträchtliche Anzahl von Läufen? – EJP
@CarlNorum Fast der gleiche generierte Code, nur dass es in den letzten beiden Beispielen mehr Anweisungen (move & load) gibt. Performances interessiert mich nicht, aber ich bin immer noch neugierig :) –