Die Leistungseinbußen bei Verwendung von ref-anstatt die gleichen Arten?
Hallo dies ist etwas, das ist wirklich stört mich und ich hoffe jemand hat eine Antwort für mich. Ich habe das Lesen über ref
(und out
) und ich versuche herauszufinden, wenn ich verlangsame meinen code mit ref
s. Häufig werde ich ersetzen, so etwas wie:
int AddToInt(int original, int add){ return original+add; }
mit
void AddToInt(ref int original, int add){ original+=add; } //1st parameter gets the result
weil in meinen Augen diese
AddToInt(ref _value, _add);
ist leichter zu Lesen, UND code, als diese
_value = AddToInt(_value, _add);
Ich weiß genau was ich Tue, auf den code mit ref
im Gegensatz zum zurückgeben eines Wertes. Die Leistung ist jedoch etwas, was ich ernst nehmen, und anscheinend die Dereferenzierung und die Bereinigung ist viel langsamer wenn Sie refs.
Was ich wissen möchte ist warum jeden post den ich lese sagt, dass es sehr wenige Orte, die Sie in der Regel passieren eine ref
(ich weiß die Beispiele sind konstruiert, aber ich hoffe, Sie bekommen die Idee), wenn es scheint mir, dass die ref
Beispiel ist kleiner, sauberer und genauer.
Ich würde auch zu gerne wissen, warum ref
wirklich langsamer ist als Rückgabe einen Wert eingeben und mir, es scheint mir, wenn ich im Begriff war, zu Bearbeiten die Funktion Wert eine Menge, bevor es wieder,,, es wäre schneller Verweis auf die eigentliche variable zu Bearbeiten, im Gegensatz zu einer Instanz der variable zu kurz, bevor es gereinigt aus dem Speicher.
- Ich würde bevorzugen in der Regel gibt einen Wert zurück, für stilistische Gründe, da ich wie nebenwirkungsfreie Funktionen.
- Sie versuchen, herauszufinden, die Leistung Kosten? Fragen Sie einen profiler, Fragen Sie nicht uns!
- Der erste Fall ist einfacher zu Lesen, denn Sie nannte Ihre Methode entsprechend. So etwas wie
_value = Add(_value, _add);
oder_value = SumOf(_value, _add);
ist besser lesbar für mich. - mögliche Duplikate von C# 'ref' - Schlüsselwort, Leistung
- Ergebnisse von meinem kleinen benchmark
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die wichtigste Zeit, die "ref" im gleichen Satz wie die Leistung ist, die bei der Diskussion einige sehr atypische Fälle, zum Beispiel in XNA Szenarien, in denen das Spiel "Objekte" sind sehr Häufig vertreten durch Strukturen statt Klassen, um Probleme zu vermeiden mit GC (das hat einen Einfluss auf die XNA). Dies wird nützlich:
In allen anderen Fällen, "ref" ist mehr allgemein im Zusammenhang mit einer zusätzlichen Nebeneffekt, nicht einfach Ausdruck in der return-Wert (siehe zum Beispiel Monitor.TryEnter).
Wenn Sie nicht ein Szenario wie das XNA - /Struktur, und es ist kein unangenehmer Nebeneffekt, dann verwenden Sie einfach die return-Wert. Zusätzlich dazu, dass mehr typische (was an sich Wert hat), könnte es auch mit Passspiel weniger Daten (und int ist kleiner als ref auf x64 zum Beispiel), und kann verlangen, weniger dereferenzieren.
Schließlich die Rückkehr Ansatz ist vielseitiger, man weiß nicht, alwas möchten, aktualisieren Sie die Quelle. Kontrast:
Ich denke, die Letzte ist die am wenigsten klar (mit den anderen "ref" eine dicht hinter ihn) und ref-Nutzung ist noch weniger klar in Sprachen, wo es nicht explizit (VB zum Beispiel).
Dem Hauptzweck, der mit dem ref-Schlüsselwort, um anzugeben, dass der Wert der Variablen kann geändert werden, indem der seine Funktion übergeben wird in. Wenn Sie übergeben Sie eine variable durch einen Wert, Aktualisierungen von innerhalb der Funktion haben keinen Einfluss auf die ursprüngliche Kopie.
Seiner äußerst nützlich (und schneller) für Situationen, wenn Sie möchten mehrere Werte zurückgeben und Gebäude eine Besondere Struktur oder Klasse für die Rückkehr zu Werten, wäre übertrieben. Zum Beispiel,
Dies ist eine ziemlich grundlegende Muster in Sprachen, die die uneingeschränkte Nutzung von Zeigern. In c/c++, die Sie Häufig sehen, primitive weitergeleitet wird, um durch einen Wert mit Klassen und arrays als Zeiger. C# macht genau das Gegenteil, so 'ref' ist praktisch in Situationen wie der oben.
Wenn Sie übergeben Sie eine variable, die Sie wollen aktualisiert, in eine Funktion von ref, nur 1 schreiben Vorgang ist erforderlich, geben Sie Ihr Ergebnis. Beim zurückgeben der Werte jedoch, die Sie normalerweise schreiben einige Variablen innerhalb der Funktion zurückgeben, dann schreiben Sie es wieder auf die Zielvariable. Abhängig von den Daten, könnte dies unnötigen Aufwand verursachen. Jedenfalls, das sind die wichtigsten Dinge, die ich in der Regel berücksichtigen, bevor Sie das ref-Schlüsselwort.
Manchmal " ref "ist ein wenig schneller, wenn verwendet, wie dies in c#, aber nicht genug, um es als eine "goto" - Rechtfertigung für die Leistung.
Hier ist, was ich habe auf eine 7 Jahre alte Maschine mit dem code unten vorbei und Aktualisierung 100k-string von ref und by value.
Ausgabe:
Iterationen: 10000000
byref: 165ms
byval: 417ms
ref
ändern müssen...Ich Stimme mit Andrew hier. Aus einer stilistischen Sicht, wenn Sie beginnen, die übergabe alles mit
ref
werden Sie schließlich am Ende der Arbeit mit devs, die werden sich erwürgen wollen, die Sie für die Gestaltung einer API wie diese!Einfach nur wieder Sachen von der Methode, nicht 100% Ihrer Methoden Rücksendung
void
. Was Sie tun, führt zu sehr unsauberen code und verwirren könnten andere devs, die am Ende der Arbeit an Ihrem code. Zugunsten der Klarheit über Leistung hier, da Sie nicht viel zu gewinnen in optomization sowieso.überprüfen Sie dies SO schreiben: C# 'ref' - Schlüsselwort, Leistung
und dieser Artikel von Jon Skeet: http://www.yoda.arachsys.com/csharp/parameters.html
Erste, nicht Mühe, ob mit
ref
ist langsamer oder schneller. Es ist eine vorzeitige Optimierung. In 99.9999% der Fälle, die Sie nicht in die Lage dies würde dazu führen, eine Leistung bottlenect.Zweite, die das Ergebnis der Berechnung als Wert zurückgeben, im Gegensatz zu mit
ref
ist bevorzugt, weil der übliche "funcional' Natur von C-ähnlichen Sprachen. Es führt zu einer besseren Verknüpfung der Aussagen/Anrufe.