Warum Math.Pow (x, 2) nicht auf x * x optimiert, weder Compiler noch JIT?

8

Ich habe in mehreren Open-Source-Projekten nicht optimalen Code gefunden, wenn Programmierer nicht darüber nachdenken, was sie verwenden.

Es gibt bis zu 10-mal den Leistungsunterschied zwischen zwei Fällen, da Math.Pow Exp- und Ln-Funktionen im internen Modus verwenden, wie es erklärt wird in dieser Antwort .

Die übliche Multiplikation ist in den meisten Fällen besser (mit kleinen Kräften), aber die beste ist natürlich die Exponentierung von Quadrierungsalgorithmus .

Daher denke ich, dass der Compiler oder JITter eine solche Optimierung mit Potenzen und anderen Funktionen durchführen muss. Warum wird es immer noch nicht eingeführt? Habe ich Recht?

    
Ivan Kochurkin 22.09.2012, 10:03
quelle

2 Antworten

7

Lesen Sie den anwser, auf den Sie erneut verwiesen haben, dass CRT eine pow() -Funktion verwendet, die Microsoft von Intel gekauft hat. Das Beispiel, das Sie mit Math.Log und Math.Exp sehen, ist ein Beispiel, das der Verfasser des Artikels in einem Programmierbuch gefunden hat.

Das "Problem" bei allgemeinen Potenzierungsmethoden ist, dass sie so konstruiert sind, dass sie genaueste Ergebnisse für alle -Fälle liefern. Dies führt oft zu einer suboptimalen Leistung für bestimmte Fälle. Um die Präformanz dieser bestimmten Fälle zu erhöhen, muss eine bedingte Logik hinzugefügt werden, die in allen Fällen zu einem Leistungsverlust führt. Da das Quadrieren oder Cubing eines Wertes so einfach ist, ohne die Math.Pow -Methode zu schreiben, ist es nicht notwendig, diese Fälle zu optimieren und den zusätzlichen Verlust für alle anderen Fälle zu übernehmen.

    
zeebonk 22.09.2012, 10:14
quelle
0

Ich würde sagen, das wäre eine schlechte Idee, weil beide Methoden nicht jedes Mal die gleichen Ergebnisse liefern.

Hier ist ein kleines Testskript

%Vor%

Es gibt unterschiedliche Genauigkeiten beider Implementierungen. Wenn eine zuverlässige Berechnung durchgeführt wird, sollte sie reproduzierbar sein. Wenn beispielsweise nur in der Release-Implementierung die quadratische Optimierung verwendet würde, würden die Debug- und Release-Version verschiedene Lösungen zurückgeben. Das kann ein Fehler für das Debuggen von Fehlern sein ...

    
user287107 22.09.2012 11:37
quelle