Ganz kleine Frage, was muesste schneller sein (Netzwerk)
-
Hallo welche Variante wuerdet ihr fuer schneller halten? Es geht darum die Namen der Ordner und Dateien innerhalb eines Verzeichnisses uebers Netzwerk zu uebertragen (nur die Namen).
1. Fuer jeden neuen Ordner bzw. Datei ein send.
2. Oder ordner und dateien in einem string zusammen zu fassen und diesen String dann "zerstueckelt" (falls er groeßer ist als der buffer) uebers Netzwerk zu senden?Danke schonmal
-
ich würde generell sagen da ist kein großer unterschied aber musst du bei allem einzeln den send befehl mit allen was auch so oder so aufgerufen wird neu aufrufen, also sollte ein großen string senden schneller sein
-
mmarcel1 schrieb:
1. Fuer jeden neuen Ordner bzw. Datei ein send.
2. Oder ordner und dateien in einem string zusammen zu fassen und diesen String dann "zerstueckelt" (falls er groeßer ist als der buffer) uebers Netzwerk zu senden?wahrscheinlich wirds am schnellsten, wenn du die anzahl der systemaufrufe (z.b. socket send-funktion) minimierst. aber wahrscheinlich auch nicht, weil das netzwerk selber der flaschenhals ist.
-
;fricky schrieb:
mmarcel1 schrieb:
1. Fuer jeden neuen Ordner bzw. Datei ein send.
2. Oder ordner und dateien in einem string zusammen zu fassen und diesen String dann "zerstueckelt" (falls er groeßer ist als der buffer) uebers Netzwerk zu senden?wahrscheinlich wirds am schnellsten, wenn du die anzahl der systemaufrufe (z.b. socket send-funktion) minimierst. aber wahrscheinlich auch nicht, weil das netzwerk selber der flaschenhals ist.
Letzteres ist auch meine Vermutung. Da die System Aufrufe sowieso viel schneller sind als die Netzwerk Übertragungen, naja ein paar Meinungen wären noch interessant.
-
weniger sends = weniger overhead ?
oder tut das os das eh alles in eins senden ?
-
Schick alles mit einem send. Einerseits hast du so weniger Systemcalls und vorallem schickt er es dann auch in einer "besseren" Paketgröße. So kann es passieren, dass er dann sehr kleine Pakete schickt und du entsprechenden Overhead (Header etc.) hast. (du könntest aber auch so etwas wie TCP_CORK verwenden.)
-
Zu viele Systemaufrufe sind nicht gut. Daten Zeichenweise zu senden ist ungünstig.
Du solltest die Technik von der Applikationslogik trennen. In Deinem Fall wäre die Applikationslogik das Sammeln der Namen. Die technische Seite ist das Schicken. Da solltest Du einen Puffer vorsehen.
Ich verwende für die Netzwerkkommunikation immer eine Klasse, die von std::iostream abgeleitet ist. std::iostream bringt einen Puffer mit. Dadurch kann ich in meiner Applikationslogik die Elemente so an die Kommunikationsschicht übertragen, wie es am logischsten und übersichtlichsten ist. Die Applikation muss noch nicht mal wissen, dass der std::ostream eine Netzwerkverbindung darstellt. Das macht die Applikation übersichtlich und wartbar.
Auf der technischen Seite kann der std::iostream (bzw std::streambuf) die Puffergrösse so einstellen, wie es am effizientesten ist.
-
blubboror schrieb:
weniger sends = weniger overhead ?
ja
oder tut das os das eh alles in eins senden ?
leider (realistisch betrachtet): nein.
-
hi,
wuerde vielleicht eine kompriemierung was bringen wenn der fladchenhals das netz ist?
gruss
msp
-
Es kommt doch ganz darauf an, was dir wichtig ist...
Du kannst durch Komprimierung die Netzwerklast und die zu übertragenden Daten reduzieren, aber insgesamt gleich sich das von der Geschwindigkeit wieder aus.
Zeit geht durch Komprimierung verloren, aber es muss weniger gesendet werden.
Zeigt geht nicht durch Komprimierung verloren, aber es muss mehr gesendet werdenWenn du Wert darauf legst, dass du nicht so viel hin und herschicken musst und die Datenmenge groß genug ist, dann kann eine Komprimierung sinnvoll sein.
-
Ob Komprimierung was bringt kommt auf das Verhältnis CPU Geschwindigkeit zu Netzwerk-Bandbreite an. Und natürlich auf die Daten - darauf wie du die komprimierbar sind.
Wenn die CPU schnell ist und das Netz langsam bringt komprimieren viel.
Wenn die CPU langsam ist und das Netz sehr schnell, wirds vermutlich nix bringen.
-
For TCP, well-behaved applications accumulate data into sensible-
chunks for sending. They accumulate until they either reach a specific
amount (2KB at absolute minimum) or until they know they are not going
to be sending any more data immediately.