Ich bin ein klassisch ausgebildeter Psychologe und kein Programmierer. Manchmal entgehen mir die fortgeschritteneren Aspekte der Programmierung, insbesondere in Bezug auf die Programmeffizienz und / oder bestimmte Best Practices, in diesem Fall in Bezug auf die Verwendung von Variablen.
Hier ist ein Pseudocode:
var a;
var b;
var c;
function GetSomeInformation() {
returns "XYZ";
}
a = GetSomeInformation();
b = GetSomeInformation();
c = GetSomeInformation();
Meine Frage lautet also:
Ist es mehr oder weniger effizient (oder gleich), Daten einmal in einer Variablen zu speichern und darauf zu verweisen, im Gegensatz zu wiederholten Aufrufen derselben Funktion?
IE, ist dieser Code effizienter?
var results = GetSomeInformation();
a = results;
b = results;
c = results;
Wenn ja, ist dieser Effizienzgewinn oder -verlust im Allgemeinen sprachübergreifend gleich oder variiert er je nach Sprache? Gibt es Schwellenwerte, bei denen es besser wird, eine Variable zu benennen, als einen wiederholten Funktionsaufruf zu verwenden oder umgekehrt? Welche Aspekte können die Effizienz verändern (z. B. gibt es einen Unterschied, ob es sich um eine Mitgliedsfunktion einer Klasse handelt oder um eine reguläre Funktion im globalen Bereich)? usw.
Wenn möglich, möchte ich speziell wissen, wie ein solcher Begriff für C ++ / MFC-Dialoge gilt, wie er beim Schreiben von Code in diesem Framework entstanden ist.
// define pointers to the items in my form
CListBox *pLISTBOX = (CListBox*) GetDlgItem(LISTBOX);
CStatic *pSTATIC_A = (CStatic*) GetDlgItem(STATIC_A);
CStatic *pSTATIC_B = (CStatic*) GetDlgItem(STATIC_B);
CEdit *pEDIT_BOX_A = (CEdit*) GetDlgItem(EDIT_BOX_A);
CEdit *pEDIT_BOX_B = (CEdit*) GetDlgItem(EDIT_BOX_B);
int SelectedIndex = pLISTBOX->GetCurSel();
pSTATIC_A->SetWindowText(pLISTBOX->GetItemData(SelectedIndex));
pSTATIC_B->SetWindowText(pLISTBOX->GetItemData(SelectedIndex));
pEDIT_BOX_A->SetWindowText(pLISTBOX->GetItemData(SelectedIndex));
pEDIT_BOX_B->SetWindowText(pLISTBOX->GetItemData(SelectedIndex));
quelle
GetSomeInformation
) rein ist und der Compiler sich dieser Tatsache bewusst ist. Andernfalls muss der Compiler es dreimal aufrufen, um sicherzustellen, dass die Nebenwirkungen wie erwartet auftreten.Außerdem wird ein guter Compiler (einschließlich Javas JIT) wiederholte Methodenaufrufe einbinden und wiederholt verwendete Werte zwischenspeichern, sodass die beiden Beispiele wahrscheinlich eine vergleichbare Leistung erzielen würden.
Beachten Sie die folgenden Faustregeln:
Lass es funktionieren, mach es richtig, mach es schnell ... in dieser Reihenfolge. - Kent Beck
Die erste Regel der Optimierung : Nicht.
Die zweite Optimierungsregel : Noch nicht.
Die dritte Optimierungsregel : Profil vor der Optimierung
Vorzeitige Optimierung ist die Wurzel allen Übels. - Donald Knuth
In den meisten Fällen werden> 90% der Zeit Ihres Programms in <10% des Codes verbracht, und ohne Profilierung Ihres Codes haben Sie keine Ahnung, welche 10% das sind. Machen Sie sich also erst Sorgen, wenn Sie Feedback erhalten. Es ist viel wertvoller, die Programmiererzeit zu optimieren als die Laufzeit .
quelle
Es ist normalerweise effizienter, einen berechneten Wert in einer lokalen Variablen zu speichern, vorausgesetzt, Ihr Compiler hat dies nicht bereits für Sie optimiert. Tatsächlich wird dies manchmal in eine Funktion selbst eingebaut, in einer Technik, die als Memoisierung bezeichnet wird .
Meistens ist der Wirkungsgrad jedoch klein genug, um als vernachlässigbar angesehen zu werden. Die Lesbarkeit sollte in der Regel nach der Richtigkeit Ihr Hauptanliegen sein.
Die Verwendung einer lokalen Variablen macht sie jedoch häufig lesbarer und bietet Ihnen das Beste aus beiden Welten. Anhand Ihres Beispiels:
Dies ist für einen menschlichen Leser viel klarer. Sie müssen nicht nur diesen langen Funktionsaufruf nicht in jeder Zeile lesen, es ist auch ausdrücklich klar, dass alle Widgets genau denselben Text erhalten.
quelle
Variablen sind im Wesentlichen kostenlos, aber der Funktionsaufruf hat unbekannte Kosten. Gehen Sie also immer mit der Variablen.
quelle
Ein allgemeiner Grundsatz I folgen ist , dass , wenn ich nicht weiß , wie eine Funktion implementiert ist, es könnte teuer sein , und wenn ich weiß , dass ich nur den Wert aus dieser Funktion einmal brauchen, ich kann es nur lokal speichern. Ihr Codebeispiel würde dann werden:
quelle