Vergleich oder Zuweisung - Was ist schneller?
-
Mich würde mal interessieren was schneller ist.
if(Zeiger) { Zeiger = 0; }oder
Zeiger = 0;wenn man annimmt, dass 'Zeiger' schon den Wert 0 haben könnte.
-
Vergleiche sind normalerweise teurer als einfache Zuweisungen (wenn es sich nicht um eingebaute Datentypen handelt). Soweit ich weiß, versuchen moderne CPUs aber vorherzusehen, welches Ergebnis ein Vergleich ergibt und führen schon einmal den passenden Code aus, schon bevor das Ergebnis überhaupt feststeht. Wenn "Zeiger" also sehr oft 0 ist, dann könnte es sein, dass die CPU die Zuweisung immer überspringt und das auch nicht später korrigieren muss. Wahrscheinlich wäre in diesem Fall die erste Variante ähnlich schnell wie die zweite.
Oder kurz: auf jeden Fall die zweite Variante verwenden, wenn es sich nicht um komplexe Datentypen handelt (z.B. strings) und nur, wenn es sich wirklich um oft ausgeführten Code handelt.
-
Da würde mich interessieren ob:
function(b); . . int function(bool b){ if(!b) return; }durch den Sprung deutlich langsamer ist als:
if(b){ function(b); }wobei ich aufgrund der permanenten Überprüfung a vorziehe.
-
aber wenn der Zeiger nicht den Wert 0 hat, sondern tatsächlich einen Speicherbereich verwaltet, dann wäre es natürlich grob fahrlässig den zeiger auf 0 zu setzen. (Es sei denn man hat noch eine Kopie von dem Zeiger ).
-
Tobi3000 schrieb:
Mich würde mal interessieren was schneller ist.
Hat dei Profiler dir gesagt dass das ein kritischer Performancekiller ist?
Nicht? Gut, dann sollte dich eher interessieren was besser ist, und das ist die lesbarere Variante 2.
Irgendwie verschwenden viele Leute Stunden drauf, durch voreilige Optimierungen ein paar Milisekunden zu gewinnen (zumindest hoffen sie das), und investieren auf der anderen Seite keine Minute in leserlichen Code - was dann später wieder Stunden beim nachlesen kostet...
-
das stimmt,
ausserdem muss man sich bei der heutigen rechenpower wirklich dumm anstellen um programme lahm laufen zu lassen durch schlechten codestil.
da hat eher ein schlechtgewählter algorithmus die grösseren auswirkungen
-
Es ist kompletter Schwachsinn das so optimieren zu wollen. Wie schon gesagt benutze einen Profiler, um deinen Flaschenhals zu finden. Alles andere ist es die Zeit nicht Wert!
Schreib leserlichen Code und wenn es wirklich dort irgendwo happert, dann kannst du das am Ende noch nachkorigieren. Mit 99.999% Wahscheinlichkeit ist es aber nicht da, sondern irgendwo beim rendern der Grafik, oder was auch immer.
Wenn dich allerdings die Technik dahinter, oder was auch immer interessiert, dann kannst du das mal den generierten asm Code anschauen und dann weisst du das recht genau. Offensichtlich ist es mit der Überprüfung bestimmt langsamer, da aber der Standard zu solchen Sachen keine Vorgaben macht, ist es den Compiler Entwicklern freigestellt das in irgendeiner Weise zu optimieren. Somit kommt es auf deinen Compiler und die Einstellungen, die du da machst drauf an, ob beides gleichschnell ist, oder nicht.
-
Ich habe keine Performanceprobleme.
Mich hat nur mal interessiert, falls ich mal 10000000 Zeiger habe, welcher Weg sich lohnen würde.
Ich bedanke mich für eure Antworten!
-
Tobi3000 schrieb:
falls ich mal 10000000 Zeiger habe, welcher Weg sich lohnen würde.
Das ist schnell gesagt: Der Weg der sich da lohnt ist, einen Algorithmus und ein Datenmodell zu finden die die Anzahl der Zeiger reduzieren

-
Tobi3000 schrieb:
Ich habe keine Performanceprobleme.
Mich hat nur mal interessiert, falls ich mal 10000000 Zeiger habe, welcher Weg sich lohnen würde.
Ich bedanke mich für eure Antworten!Wenn du 10000000 Zeiger hast, und die auf 0 setzen willst, dann verwende std::fill
*g*
(Das wird dann normalerweise zu einem memset() optimiert, und memset() ist üblicherweise sehr schnell)