Overhead?
-
Hallo habe mal eine Frage. Hab ein Programm das z.B. eine Schleife 999999999 mal durchläuft und hier nur eine einfache addition durchführt. Wenn ich diese addiotion einfach nur ausführe geht das ganz fix, wenn ich nun nach jedem Schritt den Wert ausgeben lasse erhöht sich die Laufzeit sehr krass.
Ist klar das das von den 1000 Funktionsaufruf kommt. Aber wovon genau kann mir das einer sagen?
mfg
-
Vermutlich ist der Compiler intelligent genug, die Additionen rauszuoptimieren und zu einer kompakten Anweisung zusammenzufassen - und selbst wenn nicht, braucht so eine Addition nicht viel Zeit. Die Ausgabe ist es, die deine ganze LAufzeit wegfrisst (neben dem Funktionsaufruf dürfte sich vor allem die Verbindung mit dem Monitor bemerkbar machen).
-
Zum einen ist die Ausgabe in der Konsole für sich schon nicht gerade schnell
und zum anderen kann es sein, dass dein Compiler erkannt hat, dass die
Zwischenschritte der Addition nicht benötigt werden und dadurch die Schleife
wegoptimiert wurde.Gruß mcr
EDIT: hm, zu langsam
-
CStoll schrieb:
(neben dem Funktionsaufruf dürfte sich vor allem die Verbindung mit dem Monitor bemerkbar machen)
stimmt! wenn man bedenkt wie langsam elektronen durch so'n kabel kriechen, erklärt das natürlich alles.
-
CStoll schrieb:
Vermutlich ist der Compiler intelligent genug, die Additionen rauszuoptimieren und zu einer kompakten Anweisung zusammenzufassen -
Wohl eher nicht, darf er gar nicht. Wenn die Anweisungen besagen, Addiere eins und gib's aus, dann muß das passieren.
Es liegt an der Ausgabe, die um Dimensionen mehr Operationen durchreißt, als ein simples Assembler- Add oder Inc.
-
naja kenn mich nicht so aus mit compiler, aber so intelligent werden die nich sein das sie sowas rausoptimieren können, und wenn sollte er es nicht tun.
es lieggt definitf an der ausgabe "printf" schluckt power;)
-
BorisDieKlinge schrieb:
naja kenn mich nicht so aus mit compiler, aber so intelligent werden die nich sein das sie sowas rausoptimieren können, und wenn sollte er es nicht tun.
Was verleitet Dich zu dieser Annahme?
size_t val = 0; for (size_t i = 0; i < 1000000; ++i) val += 2; printf("%u\n", val);
MSVC schrieb:
00401000 push 1E8480h 00401005 push offset string "%u\n" (4020F4h) 0040100A call dword ptr [__imp__printf (40209Ch)]
-
sagen wir mal ein ganz blödes Beispiel: Ich hab diese schleife, welche in einem thread läuft. Ein andere thread liest den wert val in einem kleinen intervall.
Wenn der compiler optimiert, würde der lese thread nur die gesamtsumme lesen und nicht die summen der zwischen iterationen, weas vll. nicht er wünscht wäre..
-
BorisDieKlinge schrieb:
sagen wir mal ein ganz blödes Beispiel: Ich hab diese schleife, welche in einem thread läuft. Ein andere thread liest den wert val in einem kleinen intervall.
Wenn der compiler optimiert, würde der lese thread nur die gesamtsumme lesen und nicht die summen der zwischen iterationen, weas vll. nicht er wünscht wäre..
Es ist nicht einmal festgelegt, dass der Wert von val (im Beispiel) nach jeder Addition wieder im Speicher landet, so dass selbst ohne die Optimierung (die der MSVC ja zweifelsfrei durchführt, wie am Assembler-Auszug zu sehen ist) der andere Thread böse auf die Nase fallen kann (Stichwort volatile).
Deshalb predigen wir ja auch dauernd, dass es im Zusammenhang mit Threads ohne Synchronisation nicht geht (auch wenn Du es bisweilen nicht einsiehst :D).
-
pointercrash() schrieb:
CStoll schrieb:
Vermutlich ist der Compiler intelligent genug, die Additionen rauszuoptimieren und zu einer kompakten Anweisung zusammenzufassen -
Wohl eher nicht, darf er gar nicht. Wenn die Anweisungen besagen, Addiere eins und gib's aus, dann muß das passieren.
Ja, die Folge "addiere und gib aus" lässt sich nur schwer optimieren, aber ich bezog mich auch auf die Variante, ohne Ausgabe - und bei so primitiven Sachen wie Addieren könnte der Compiler noch in der Lage sein, das Ergebnis abkürzen zu können (siehe LordJaxom's Beispiel).
@elektro-fan: Das hat nichts mit der Geschwindigkeit der Elektronen zu tun, das ist einfach der Aufwand, um die erforderlichen Ausgaben in eine lesbare Anordnung von hellen und dunklen Pixeln umzurechnen
-
CStoll schrieb:
das ist einfach der Aufwand, um die erforderlichen Ausgaben in eine lesbare Anordnung von hellen und dunklen Pixeln umzurechnen
auch nicht. wowas macht alles hardware und die verträgt mehrere millionen megabits pro sekunde. mit einer printf-schleife wird man sie kaum überfordern können. bremsen sind, wie immer, softwaresysteme die davor hängen, OS, fenstersystem und der ganze firlefanz.