Sie suchen Leistung am falschen Ort. Das Problem bei Funktionsaufrufen ist nicht, dass sie viel kosten. Es gibt noch ein anderes Problem. Funktionsaufrufe könnten absolut kostenlos sein, und Sie hätten immer noch dieses andere Problem.
Es ist so, dass eine Funktion wie eine Kreditkarte ist. Da Sie es leicht verwenden können, neigen Sie dazu, es mehr zu verwenden, als Sie vielleicht sollten. Angenommen, Sie nennen es 20% mehr als nötig. Dann enthält eine typische große Software mehrere Ebenen, wobei jede aufrufende Funktion in der darunter liegenden Ebene ausgeführt wird, sodass der Faktor 1,2 durch die Anzahl der Ebenen zusammengesetzt werden kann. (Wenn beispielsweise fünf Schichten vorhanden sind und jede Schicht einen Verlangsamungsfaktor von 1,2 aufweist, beträgt der zusammengesetzte Verlangsamungsfaktor 1,2 ^ 5 oder 2,5.) Dies ist nur eine Möglichkeit, darüber nachzudenken.
Dies bedeutet nicht, dass Sie Funktionsaufrufe vermeiden sollten. Wenn der Code ausgeführt wird, sollten Sie wissen, wie Sie den Abfall finden und beseitigen können. Es gibt viele ausgezeichnete Ratschläge dazu auf Stackexchange-Sites.
Dies gibt einen meiner Beiträge.
HINZUGEFÜGT: Kleines Beispiel. Einmal arbeitete ich in einem Team an Fabriksoftware, die eine Reihe von Arbeitsaufträgen oder "Jobs" verfolgte. Es gab eine Funktion JobDone(idJob)
, die erkennen konnte, ob eine Arbeit erledigt war. Eine Arbeit wurde erledigt, wenn alle ihre Unteraufgaben erledigt waren, und jede dieser Aufgaben wurde erledigt, wenn alle ihre Unteroperationen erledigt waren. All diese Dinge wurden in einer relationalen Datenbank verfolgt. Ein einzelner Aufruf einer anderen Funktion könnte all diese Informationen extrahieren, die so JobDone
genannte andere Funktion, sehen, ob die Arbeit erledigt ist, und den Rest wegwerfen. Dann könnten die Leute leicht Code wie diesen schreiben:
while(!JobDone(idJob)){
...
}
oder
foreach(idJob in jobs){
if (JobDone(idJob)){
...
}
}
Sehen Sie den Punkt? Die Funktion war so "mächtig" und einfach aufzurufen, dass sie viel zu oft aufgerufen wurde. Das Leistungsproblem waren also nicht die Anweisungen, die in die Funktion ein- und ausgehen. Es musste einen direkteren Weg geben, um festzustellen, ob Arbeiten erledigt waren. Auch dieser Code könnte in Tausende von Zeilen ansonsten unschuldigen Codes eingebettet sein. Der Versuch, das Problem im Voraus zu beheben, ist das, was jeder versucht, aber das ist wie der Versuch, Pfeile in einen dunklen Raum zu werfen. Stattdessen müssen Sie es zum Laufen bringen und sich dann vom "langsamen Code" sagen lassen, was es ist, indem Sie sich einfach Zeit nehmen. Dafür benutze ich zufällige Pausen .