Frage

Was ist die optimale Puffergröße mit einem Strom zu verwenden, um von HttpWebResponse.GetResponseStream ()?

Online-Beispiele reichen von 256b zu so viel wie 5Kb. Was gibt? Ich denke, Puffergrößen situations sein könnten. Wenn ja, was sind die Situationen, welche Art von Puffergröße zu benutzen?

Danke.

War es hilfreich?

Lösung

Wirklich, ist es nicht sehr wichtig.

Sicher, wenn Sie wirklich kleine Puffer verwenden, können Sie ein paar zusätzlichen Anrufe nach unten durch die Schichten machen müssen, um das Bytes zu erhalten (obwohl der Strom wahrscheinlich zumindest ein gewissen Puffer tun - ich weiß nicht, was es ist defaults sind). Und sicher, wenn Sie wirklich große Puffer verwenden, werden Sie etwas Speicher verschwenden und eine Fragmentierung einzuführen. Da Sie IO offensichtlich hier tun, Sie zu jeder Zeit gewinnen, indem die Puffer Tweaking geht vom IO-Zeit dominiert.

Als allgemeine Regel gilt, gehe ich mit einer Zweierpotenz zwischen 2048 (2k) und 8192 (8k). So stellen Sie sicher, dass Sie wissen, was Sie tun, wenn Sie mit einem Puffer gleich oder größer als 85.000 Bytes gehen (es ist dann ein "großes Objekt" und unterliegen unterschiedlichen GC Regeln ).

In der Tat wichtiger als die Puffergröße ist, wie lange sie halten. Für Objekte außerhalb der großen Objekts Haufen, der GC mit sehr kurzlebigen Objekten (Gen 0 Sammlungen sind schnell), oder sehr langlebige Objekte (Gene 2) im Umgang ist sehr gut. Objekte, die lange genug leben, um Gen 1 oder 2 zu erhalten, bevor befreit sind vergleichsweise teurer, und in der Regel viel mehr wert Ihre Zeit sich Gedanken darüber, als wie groß der Puffer ist.

Ein letzter Hinweis: Wenn Sie denken, dass Sie ein Leistungsproblem haben wegen der Größe von Puffern Sie verwenden, Test es. Es ist unwahrscheinlich, aber wer weiß, vielleicht haben Sie eine ungeradee Zusammenfluß von OS-Version, Netzwerk-Hardware und Treiberversion, die einige ungeradeen Probleme mit bestimmten großen Puffern hat.

Andere Tipps

Meine anekdotische Erfahrung ist, dass es wirklich auf abhängt, was Sie tun, aber in der Regel etwas im Bereich von 1024-4096 Bytes (1-4KB aka Zweierpotenz) würde ich ein vergleichbare Leistung (mit 4 KB ist die " beste“Anzahl ich gesehen habe).

Im Grunde wollen Sie einen Puffer groß genug, so dass Sie nicht unnötig sind Daten aus dem Stream zu lesen, aber nicht so groß, Sie verringern kehren zurück. Wenn Ihr Puffer zu groß (~ MBs), dann werden Sie Ihr Speicher-Cache-Misses erhöhen, was tatsächlich beginnen könnte Ihre Leistung zu verringern. Natürlich variiert dies eine Menge basierend auf den tatsächlichen H / W (Busgeschwindigkeit, Cache-Größe usw.), aber ich habe Fälle scheinen, wo ein 4MB Puffer langsamer als die 4-KB-Puffer war (beide Fälle eine lange Lebensdauer hatte, so GC war nicht ein Problem).

Wie Jonathan stellt fest, testen Sie Ihre aktuelle Implementierung vor vorzeitige Optimierung versuchen.

Eigentlich Problem, das ich habe, wenn die Puffergröße zu klein ist. Ich habe es getestet und überprüft es, dass Puffergröße sollte nicht zu klein sein Wert eingestellt werden. In meinem Beispiel stelle ich es bis 2048 und der Download wird immer sehr langsam firefox einen Vergleich (Firefox ist ohne zu Download Segmentierung, die gleiche wie bei mir).

Und nachdem ich es auf eine große Größe 409600 gesetzt ist, wird der Download viel schneller, ich denke, dass zusätzliche Call-Overhead kosten oder so, dass der Download langsam macht. Vielleicht in der Netzebene wird der Puffer Ihre Puffergröße überschreitet, so muss das TCP bitten, das Paket erneut zu senden? (Nur eine Vermutung, wie ich weiß nicht, wie TCP funktioniert), aber kleine Puffergröße verlangsamt sich definitiv mein Download unten. Ich habe es getestet, indem Sie mit Download firefox Standard (ohne Add-On und segmenetation) und meine Klasse verwenden, beide sind viel zu unterschiedlich.

Jetzt ist es viel schneller, es jedes Mal, Schleifen, wird es liest hier etwa 200000 Bytes (200Kb) als die Verbindung ruhig schnell ist, aber nachdem ich zwei Threads laufen lasse, wird es viel langsamer, muß wahrscheinlich mit anderen teilen Gewinde.

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