Ich arbeite an einem Scala-basierten Analysesystem (http://www.hiringthing.com), und ich stelle fest, dass ich mir oft die folgende Frage stelle. Bei einer "reinen" Funktion ohne Nebeneffekte kann ich, wenn ich diese Funktion zweimal mit den gleichen Eingaben triff, erwarten, dass der Compiler den Wert aus dem ersten Durchlauf wieder verwendet oder den gesamten Code erneut durchläuft. Anders ausgedrückt, ist das erste Beispiel unten effizienter als das zweite Beispiel?
%Vor%gegen
%Vor%Wenn der Compiler tatsächlich den zweiten Fall optimieren kann, gibt es Grenzen für die Komplexität der Funktion?
Was ich tun möchte, ist es, einige mathematische Heavy-Funktionen mehrmals zu vermeiden, nur um die Programmierung zu vereinfachen ...
Danke
Von dem, was ich gesehen habe, optimiert der Scala-Compiler das überhaupt nicht. Die JVM kann, wenn sie feststellen kann, dass sich die Ergebnisse nicht ändern, aber oft hat sie keine gute Möglichkeit, dies zu wissen.
Im Allgemeinen, wenn es sich um eine triviale Berechnung handelt, macht das keinen Unterschied, sowohl weil es trivial ist, als auch weil die JVM herausfinden kann, dass sie es nur einmal tun muss. Wenn es kompliziert ist und Geschwindigkeit wichtig ist, sollten Sie die Methode val a =
verwenden, es sei denn, Sie haben Benchmarks, die Ihnen zeigen, dass die JVM in diesem Fall intelligent genug ist.
Beachten Sie, dass es manchmal schwierig ist, Vals zu platzieren. Es gibt zwei Möglichkeiten, dies zu umgehen. Beachten Sie zunächst, dass fast alles durch die äquivalente Anweisung in geschweiften Klammern ersetzt werden kann. Daher sind die Ausnahmen möglicherweise seltener als Sie denken. Diese Methode kann unter bestimmten Umständen auch nützlich sein:
%Vor%Der scala-Compiler versucht nicht, alle Aufrufe von Funktionen oder Methoden zu optimieren, es sei denn, Sie verwenden ausdrücklich die Annotation @inline (und auch das wird nicht garantiert). Das heißt, die JVM und insbesondere der Hotspot-JIT-Compiler werden mit ziemlicher Sicherheit in der Lage sein, den Aufruf in Ihre Beispiele zu "hinzufügen" und dann die resultierenden gemeinsamen Unterausdrücke zu entfernen.
Wie immer bei Fragen zu Performance- und Compiler-Optimierungen sollten keine Antworten ohne umfangreiches, professionelles Benchmarking als Gospel verstanden werden. Die Wertentwicklung in der Vergangenheit ist kein Garant für zukünftige Erträge. Der Inhalt kann sich während des Versands absetzen. Wenn die Schwellung nach vier Stunden anhält, suchen Sie Ihren Arzt auf. Alle Modelle über 18.
Ohne ein Effektsystem kann der Compiler einfach nicht entscheiden, Methoden (oder Function
) als Rückgabewerte zu verwenden.
Wie es bei den meisten Sprachen in der gesamten Computergeschichte der Fall war, liegt es an Ihnen, die Redundanz aus Ihren Algorithmen zu entfernen.
Tags und Links scala