10 Stimmen

Optimale Puffergröße für den Antwortstrom von HttpWebResponse

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

Online-Beispiele variieren von 256b bis zu 5Kb. Woran liegt das? Ich vermute, dass die Puffergrößen situationsabhängig sein könnten. Wenn ja, was sind die Situationen zu verwenden, welche Art von Puffergröße?

Merci.

7voto

Jonathan Rupp Punkte 15162

Das ist wirklich nicht sehr wichtig.

Sicher, wenn Sie wirklich kleine Puffer verwenden, müssen Sie möglicherweise ein paar zusätzliche Aufrufe durch die Schichten machen, um die Bytes zu erhalten (obwohl der Stream wahrscheinlich zumindest einige Pufferung tut - ich weiß nicht, was es die Standardeinstellungen sind). Und sicher, wenn Sie wirklich große Puffer verwenden, werden Sie etwas Speicher verschwenden und eine Fragmentierung einführen. Da Sie offensichtlich tun IO hier, jede Zeit, die Sie durch Optimieren der Puffer gewinnen wird durch die IO-Zeit dominiert werden.

In der Regel wähle ich eine Zweierpotenz zwischen 2048 (2k) und 8192 (8k). Vergewissern Sie sich nur, dass Sie wissen, was Sie tun, wenn Sie einen Puffer von 85.000 Byte oder mehr wählen (es ist dann ein "großes Objekt" und unterliegt anderen GC-Regeln )

Noch wichtiger als die Größe des Puffers ist, wie lange man ihn hält. Bei Objekten außerhalb des großen Objektheaps kann die GC sehr gut mit sehr kurzlebigen Objekten (Gen 0-Sammlungen sind schnell) oder mit sehr langlebigen Objekten (Gen 2) umgehen. Objekte, die lange genug leben, um Gen 1 oder 2 zu erreichen, bevor sie freigegeben werden, sind vergleichsweise kostspieliger, und es lohnt sich normalerweise viel mehr, sich darüber Gedanken zu machen, als darüber, wie groß der Puffer ist.

Ein letzter Hinweis: Wenn Sie glauben, dass Sie aufgrund der Größe der verwendeten Puffer ein Leistungsproblem haben, Test es. Es ist zwar unwahrscheinlich, aber wer weiß, vielleicht haben Sie ein seltsames Zusammentreffen von Betriebssystemversion, Netzwerkhardware und Treiberversion, das ein seltsames Problem mit Puffern bestimmter Größe verursacht.

3voto

Erich Mirabal Punkte 9642

Meine anekdotische Erfahrung ist, dass es wirklich davon abhängt, was Sie tun, aber in der Regel alles im Bereich von 1024-4096 Bytes (1-4KB a.k.a. Zweierpotenz) würde mir eine vergleichbare Leistung geben (wobei 4KB die "beste" Zahl ist, die ich gesehen habe).

Grundsätzlich sollte der Puffer groß genug sein, damit Sie nicht unnötig Daten aus dem Datenstrom lesen müssen, aber auch nicht so groß, dass Sie den Ertrag schmälern. Wenn Ihr Puffer zu groß ist (~MBs), dann werden Sie Ihre Speicher-Cache-Misses erhöhen, was sich tatsächlich auf Ihre Leistung auswirken kann. Natürlich hängt dies stark von der tatsächlichen Hardware ab (Busgeschwindigkeit, Cachegröße usw.), aber ich habe Fälle erlebt, in denen ein 4-MB-Puffer langsamer war als ein 4-KB-Puffer (beide Fälle hatten eine lange Lebensdauer, so dass GC kein Problem war).

Wie Jonathan anmerkt, sollten Sie Ihre aktuelle Implementierung testen, bevor Sie voreilige Optimierungen vornehmen.

2voto

John Kenedy Punkte 544

Ich habe ein Problem, wenn die Puffergröße zu klein ist. Ich habe es getestet und bestätigt, dass die Puffergröße nicht auf einen kleinen Wert eingestellt werden sollte. In meinem Beispiel habe ich es auf 2048 und der Download wird immer SEHR LANGSAM im Vergleich zu Firefox ein (Firefox ein ist ohne Download-Segmentierung zu, das gleiche wie mein).

Und nachdem ich es auf eine große Größe 409600, der Download ist VIEL SCHNELLER, ich denke, dass zusätzliche Aufruf wird Overhead oder so, dass der Download langsam macht kosten. Vielleicht in der Netzwerk-Ebene, ist der Puffer Ihre Puffergröße überschreiten, so dass die TCP müssen fragen, um das Paket erneut zu senden? (Nur eine Vermutung, da ich nicht weiß, wie TCP funktioniert), aber eine kleine Puffergröße verlangsamt definitiv meinen Download. Ich habe es getestet, indem ich mit Firefox Standard-Download (ohne Add-on und segmenetation) und mit meiner Klasse, beide sind viel zu unterschiedlich.

Jetzt ist es viel schneller, jedes Mal, wenn es Schleifen, wird es etwa 200000 Bytes (200Kb) zu lesen, wie die Verbindung hier ist ruhig schnell, aber nachdem ich zwei Threads ausgeführt werden, wird es viel langsamer, wahrscheinlich müssen mit einem anderen Thread zu teilen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X