System.Console.WriteLine() vs printfn in F#
Was ist der Unterschied zwischen folgenden zwei Aussagen in F#?
Sind Sie keine Vorteile oder Nachteile im Vergleich zu jedem anderen (außer die offensichtliche syntax-Unterschiede)?
Ich verstehe, dass WriteLine() ist Teil der .NET, verstehe aber nicht, welche Auswirkungen dies haben könnte.
Der Beispielcode:
printfn "This is an integer: %d" 5
System.Console.WriteLine("This is an integer: {0}" , 5)
Mono-System.IO.TextWriter github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/...
Vielen Dank für die extra info 🙂
Vielen Dank für die extra info 🙂
InformationsquelleAutor OMGtechy | 2013-06-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
printfn
und seine verschiedenen Cousinen haben mehrere Vorteile:printfn "%d" "bad type"
wird nicht kompiliert.%O
druckt jedes Objekt%A
printfn "%d, %d" 3
ist ein Gültiger Ausdruck. Dies ist besonders raffiniert, da der compiler kann prüfen, ob Sie tatsächlich die richtige Zahl der Argumente, wenn Sie später dazu Teilausdruck - im Gegensatz zuConsole.WriteLine
die gerne akzeptieren, zu viele oder zu wenige Parameter.In der Praxis der häufigste partielle Anwendung ist wahrscheinlich nur der format-string; z.B.
Jedoch vor F# 3.1, es ist auch langsam. Es ist reichlich schnell genug, um mit Euch die coder, aber wenn Sie es in irgendeiner form der Serialisierung, es könnte sich zu einem Engpass. Die F# 3.1 release-Ankündigung (was verteilt wird als Teil von Visual Studio 2013) Forderungen zur Verbesserung der performance dramatisch, obwohl ich es nicht überprüft.
Persönlich, ich in der Regel verwenden printfn für unsystematische Codierung, und dann bin ich weitgehend stick zu
%A
mit der gelegentlichen anderen Planer geworfen. Jedoch, die .NET native string-Formatierung ist immer noch nützlich in einigen Fällen für seine detaillierte Kultur-und Formatierungs-Optionen. Wenn Sie wollen maximale Geschwindigkeit direkter Verkettung (oder einStringBuilder
) leicht übertreffen, die beide, wie dies verhindert die Interpretation der format-string.Ich bin damit einverstanden, dass
printfn
- und Verwandte Funktionen sollte in der Regel anstelle von verwendet werdenConsole.WriteLine()
, aber es ist erwähnenswert, dass Sie auch relativ langsam (das kann von Bedeutung sein für einige Anwendungsfälle).Ich wusste das nicht, vielen Dank für das update - ich denke, ich habe nie versucht, es zu benutzen für riesige Datenmengen 🙂 aktualisiert!
F# 3.1 offenbar optimiert printfn besser - die release-Seite wirbt ein Beispiel, wo die Leistung ist bis zu 40x besser (vermutlich aufgrund der Laufzeit der Reflexion wird vermieden). Siehe blogs.msdn.com/b/fsharpteam/archive/2013/06/27/...
InformationsquelleAutor
Hier sind einige vor-und Nachteile von
printf
-ähnliche Funktionen im Vergleich zuConsole.WriteLine
.Vorteile:
printfn
Funktionen sind typsicher:Es ist einfach zu tun die partielle Anwendung mit
printfn
, das ist nicht der Fall mitConsole.WriteLine
durch die übermäßige Anzahl von überlastungen:printfn
support F# - Typen besser über%A
Planer.Nachteile:
Abgesehen von nicht in der Lage sein wiederzuverwenden Parameter wie @mydogisbox erwähnt,
printfn
-wie Funktionen sind viel langsamer alsConsole.WriteLine
(durch die Verwendung der Reflexion); Sie sollten nicht die ehemaligen für logging-Zwecke.InformationsquelleAutor
Die Funktion printfn kann teilweise Anwendung.
Als der standard .NETZ-Funktionen nehmen Sie Tupel als Parameter in F# können Sie nicht mit der partiellen Applikation.
Einen zweiten Vorteil printfn ist, dass die Argumente eingegeben werden. Also dieser Code wird nicht kompiliert:
InformationsquelleAutor
Abgesehen von Stil,
System.Console.WriteLine
hat den Vorteil, dass Sie in der Lage, um die Wiederverwendung von Parametern, D. H.System.Console.WriteLine("This is a integer twice: {0} {0}", 5)
Auch, wie erwähnt,hier, die Sie tun können, pretty-printing von F# - Objekt mit
printfn
was Sie nicht tun können, mitSystem.Console.WriteLine
und da es sich nicht nehmen, ein Tupel, die Sie tun können teilweise Anwendung.Wie bereits von anderen
printfn
verwendet Reflexion und damit deutlich langsamer alsPrintLine
, aber auch ist typesafe.Nur damit Sie wissen, Sie können bewegen Sie die "grüne mark", Wann immer Sie möchten.
das ist wahr, aber die Menschen sind weniger wahrscheinlich zu beantworten (oder sogar sehen), wenn es eine Antwort, die bereits als korrekt markiert.
Fairer Punkt. Zwar nahm ich die andere Antwort, die Wiederverwendung von Parametern ist gut zu wissen!
InformationsquelleAutor