2016-12-24 4 views
3

Gibt es Leistungsprobleme mit verschachtelten Funktionen in F #?Geschachtelte Funktionen Leistung (F #)

Wenn ich eine Funktion habe, die für jedes Element in einem Array aufgerufen wird und diese Funktion verschachtelte innere Funktionen hat, bedeutet das, dass bei jeder Iteration alle internen geschachtelten Funktionen deklariert, erstellt und zugewiesen werden müssen?

Scheint schrecklich ineffizient, aber ich mag die Lesbarkeit von verschachtelten Funktionen im Gegensatz zu privaten äußeren Funktionen.

+3

Maybe - Benchmark und siehe –

+1

Von Interesse: [F # interaktive # Zeit] (https://docs.microsoft.com/en-us/dotnet/articles/fsharp/tutorials/fsharp-interactive/) - [Beispiel] (https://github.com/jack-pappas/fsharp-logic-examples/blob/d78b170ecfd7526971153e2f2a27446e0c51dd6e/Examples/dp.fsx#L41) –

Antwort

13

Verschachtelte Funktionen werden vom Compiler in Klassen extrahiert, die von FSharpFunc erben, verschachtelt innerhalb des Moduls oder des Typs, in dem ihre Elternfunktion definiert ist. Der Compiler macht also im Wesentlichen für Sie das, was Sie andernfalls mit externem privat tun würden Funktionen.

Zur Laufzeit geschieht nur die Instanziierung dieser Objekte. Im Vergleich zum Ausführen von Inline-Code sind die Kosten höher, aber ich nehme an, dass sie drastisch unter dem liegen, was Sie in Ihrem mentalen Modell erwartet haben.

Es bleibt jedoch ein zusätzliches Objekt für GC. Wäre diese Objekt-Instanziierung dann in einer engen Schleife von Bedeutung? In einer naiven Implementierung, bei der das Funktionsobjekt in jeder Iteration neu instanziiert wird, vielleicht ja. Der F # -Compiler ist jedoch schlauer und instantiiert typischerweise die Funktionen, die einmal außerhalb der Schleife im Schleifenkörper verwendet werden. Also wieder, die Kosten sind wahrscheinlich so niedrig wie es sein kann.

Im Zweifelsfall wenden Sie sich an ILSpy und Benchmark. Als Faustregel gilt: Sorgen Sie nicht darüber und verwenden Sie nur verschachtelte Funktionen.

+0

Super Antwort. Danke für Ihre Hilfe. – Connel

+1

Sie haben vergessen zu erwähnen, nicht-Schließung innere Funktionen hissen. –

+1

@FyodorSoikin: Gibt es einen Unterschied zwischen Schließungen und Nicht-Schließungsfunktionen in dieser Hinsicht? Ich habe es nicht beobachtet. – scrwtp