Frage

Ich bin der Meinung, dass es teuer ist, Gassenumerator () und Ienumerator zu verwenden. Gibt es bessere Vorschläge?

Ich bin offen für eine andere Datenstruktur, wenn sie ähnliche Funktionen mit einer besseren Leistung bietet.

Nach Gedanken:
Wäre ein generischer Stapel eine bessere Idee, damit die Besetzung nicht notwendig ist?

War es hilfreich?

Lösung

Haben Sie Benchmarks gemacht oder sind sie nur Gefühle?

Wenn Sie der Meinung sind, dass der größte Teil der Verarbeitungszeit damit verbracht wird, über Stapel zu schieben, sollten Sie sie bewerten und sicherstellen, dass dies der Fall ist. Wenn ja, haben Sie einige Optionen.

  1. Gestalten Sie den Code so neu, damit die Schleife nicht erforderlich ist
  2. Finden Sie ein schnelleres Schleifenkonstrukt. (Ich würde Generika empfehlen, obwohl es nicht so wichtig wäre. Noch einmal Benchmarks).

BEARBEITEN:

Beispiele für Schleifen, die möglicherweise nicht erforderlich sind, sind, wenn Sie versuchen, Suchanlagen in einer Liste durchzuführen oder zwei Listen oder ähnliche zu entsprechen. Wenn die Schleife lange dauert, prüfen Sie, ob es sinnvoll ist, die Listen in binäre Bäume oder Hash -Karten zu stecken. Es kann zu anfänglichen Kosten für die Erstellung des Erstellens kommen, aber wenn der Code neu gestaltet ist, können Sie dies möglicherweise zurückbekommen, indem Sie später O (1) -Scouds haben.

Andere Tipps

Stack<T> (mit foreach) würde tatsächlich die Besetzung retten, aber tatsächlich Boxen ist nicht alles das Schlecht im großen Schema der Dinge. Wenn Sie Leistungsprobleme haben, bezweifle ich, dass dies der Bereich ist, in dem Sie viel Wert hinzufügen können. Verwenden Sie einen Profiler und konzentrieren Sie sich auf echte Probleme - sonst ist dies verfrüht.

Beachten Sie, dass, wenn Sie die Daten nur einmal lesen möchten (dh Sie freuen sich gerne über den Stapel), dann dies dann dies kann Seien Sie schneller (vermeiden Sie den Overhead eines Enumerators); Ymmv.

    Stack<T> stack = null;
    while (stack.Count > 0)
    {
        T value = stack.Pop();
        // process value
    }

Ja, die Verwendung eines generischen Stacks sparen die Besetzung.

Wenn Sie die Funktionalität eines Stapels (im Anspruch auf eine Liste oder einen anderen Colleciton -Typ) benötigen, verwenden Sie einen generischen Stapel. Dies wird die Dinge ein wenig beschleunigen, da der Compiler das Casting zur Laufzeit überspringt (weil er zur Kompilierung der Kompilierzeit gekoppelt ist).

Stack<MyClass> stacky = new Stack<MyClass>();

foreach (MyClass item in stacky)
{
    // this is as fast as you're going to get.
}

Aufzählung über einen Generikum IEnumerable<T> oder IEnumerator<T> Es erzeugt keine Besetzung, wenn die iterierende Variable vom Typ T vom Typ T ist.

Rico Mariani (Microsoft Performance Architect) hat einige Beiträge, in denen die Unterschiede und die Grundlagen beschrieben werden

In Bezug auf die Geschwindigkeit gibt es mehrere Variablen, die vom Kontext abhängt. Zum Beispiel können Sie in einer auto-memory-verwalteten Codebasis wie C#Zuweisungsspitzen erhalten, die die Framerate in so etwas wie einem Spiel beeinflussen können. Eine schöne Optimierung, die Sie für diese anstelle eines Foreach durchführen können, ist ein Aufzähler mit einer Weile -Schleife:

var enumerator = stack.GetEnumerator();

while(enumerator.MoveNext ()) {
  // do stuff with enumerator value using enumerator.Current
  enumerator.Current = blah
}

Was die CPU -Benchmarks betrifft, ist dies wahrscheinlich nicht schneller als ein Foreach, aber es kann unbeabsichtigte Zuteilungsspitzen haben, die letztendlich die Leistung Ihrer Anwendung "verlangsamen" können.

Eine Alternative zum Erstellen eines Enumerators besteht darin, die Toarrray -Methode zu verwenden und dann über das Array zu iterieren. Der Stapel -Iterator verursacht einen leichten Aufwand für die Überprüfung, ob der Stapel geändert wurde, während die Iteration über das Array schnell wäre. Es gibt jedoch natürlich den Overhead, das Array in erster Linie zu erstellen. Wie Mats sagt, sollten Sie die Alternativen bewerten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top