Dies sind 2 Funktionen, fun1
benötigt 1 Parameter, fun2
benötigt 4 zusätzliche nutzlose Parameter. Wenn ich für x64 anvisierte, benötigt fun1
4s, aber fun2
benötigt weniger als 1s. Wenn ich anycpu anvisiere, dann brauchen beide weniger als 1s.
Es gibt eine ähnliche Frage, die ich hier gestellt habe warum Seq.iter ist 2x schneller als for-Schleife, wenn das Ziel für x64 ist?
Es ist in .Net 4.5 Visual Studio 2012, F # 3.0, in Windows 7 x64
kompiliert %Vor%Dies ist keine vollständige Antwort, es ist die erste Diagnose des Problems.
Ich kann das Verhalten mit der gleichen Konfiguration reproduzieren. Wenn Sie F # Interactive 64-bit in Tools -> Options -> F# Tools -> F# Interactive
aktivieren, können Sie dort dasselbe Verhalten beobachten.
Anders als die andere Frage , x64 Jitter ist kein Problem. Die Option "Tailaufrufe generieren" in der Projekteigenschaft führt zu einer erheblichen Verlangsamung von test1
im Vergleich zu test2
. Wenn Sie diese Option deaktivieren, haben zwei Fälle ähnliche Geschwindigkeiten.
Andererseits können Sie das inline
-Schlüsselwort für fun1
verwenden, damit kein Tail-Aufruf erforderlich ist. Zwei Beispiele sind in der Ausführungszeit wieder vergleichbar, egal fun2
ist inline oder nicht.
Es ist seltsam, dass das Hinzufügen von tail.
opcode zu fun1
es sehr viel langsamer macht als das Gleiche mit fun2
. Sie können F # Team für weitere Untersuchungen kontaktieren.
Der Unterschied ist mit ziemlicher Sicherheit eine Eigenart des JITer. Es erklärt auch die inkonsistenten Ergebnisse. Dies ist ein häufiges Problem bei Micro-Benchmark-Tests wie diesem. Führen Sie eine oder mehrere redundante Ausführungen der Methoden durch, um das Ganze hinter den Kulissen zu kompilieren und das letzte zu zeihen. Sie werden identisch sein.
Aufgrund dieser Eigenart können Sie bizarrere Ergebnisse erzielen.
Tags und Links f#