Frage

Was ist der Unterschied - leistungsmäßig - zwischen von einem Socket 1 Byte eine Zeit vs Lesung im großen Teil zu lesen

?

Ich habe eine C ++ Anwendung, die Seiten von einem Webserver ziehen muss und analysieren, um die empfangene Seite Zeile für Zeile. Derzeit lese ich ein Byte zu einem Zeitpunkt, bis ich ein CRLF oder das Maximum von 1024 Bytes begegnen erreicht ist.

in großem Teil (zB 1024 Byte zu einem Zeitpunkt) Wenn das Lesen ist viel besser Performance-weise, jede Idee, wie man das gleiche Verhalten zu erreichen, ich habe zur Zeit (dh der Lage zu speichern und zu verarbeiten 1 html Zeile zu einem Zeitpunkt - bis zum CRLF, ohne die nachfolgenden Bytes noch raubend)

EDIT:

Ich kann nicht zu groß Puffer leisten. Ich bin in einem sehr engen Code Budget als die Anwendung in einem Embedded-Gerät verwendet wird. Ich ziehe es nur einen Puffer fester Größe zu halten, vorzugsweise eine html Linie zu einer Zeit zu halten. Das macht meine Parsen und andere Verarbeitung einfach, wie ich zu jeder Zeit bin ich versuche, den Puffer für die Analyse zugreifen zu können, kann ich davon ausgehen, dass ich eine komplette HTML-Linie bin verarbeiten.

Danke.

War es hilfreich?

Lösung

Wenn Sie direkt aus der Steckdose lesen, und nicht von einer Zwischengeordneten Darstellung, die gepuffert werden kann, dann ohne Zweifel ist es einfach besser vollständig die 1024 Bytes zu lesen, setzen Sie sie in RAM in einem Puffer und dann die Daten aus dem RAM analysieren.

Warum? Lesen auf einem Sockel ist ein Systemaufruf, und es führt zu einem Kontextschalter auf jeden lesen, was teuer ist. Lesen Sie mehr darüber: IBM Tech Lib: Boost-Buchse Leistungen

Andere Tipps

Ich kann nicht kommentieren C ++, aber von anderen Plattformen - ja, das kann einen machen groß Unterschied; insbesondere in der Menge von Schaltern der Code es braucht, und die Anzahl der Male tun muss, um die Asynchron-Natur-Streams usw. sorgen.

Aber der wahre Test ist natürlich, es zu profilieren. Warum nicht eine grundlegende app schreiben, die eine beliebige Datei churns durch beide Ansätze verwenden und testen Sie es für einige typische Dateien ... die Wirkung ist in der Regel überraschend, , wenn der Code IO gebunden. Wenn die Dateien sind klein und die meisten Ihrer App Laufzeit ausgegeben Verarbeitung die Daten, sobald es im Speicher ist, werden Sie wahrscheinlich nicht einen Unterschied bemerken.

Die erste und einfachste:

cin.getline(buffer,1024);

Zweitens, in der Regel alle IO gepuffert ist, so dass Sie nicht zu viel Sorgen machen

Drittens beginnen CGI-Prozess in der Regel viel mehr als Eingabeverarbeitungskosten (es sei denn, es ist riesig Datei) ... So kann man einfach nicht darüber nachdenken, es.

G'day,

Einer der großen Leistung Hits durch ein Byte zu einem Zeitpunkt zu tun ist, dass Ihr Kontext von Benutzern Zeit in Systemzeit wird immer und immer wieder. Und über. Nicht effizient überhaupt.

ein großes Stück Grabbing, in der Regel bis zu einer MTU-Größe, ist messbar effizienter zu gestalten.

Warum nicht scannen den Inhalt in einen Vektor und iterieren, dass Ihre Eingabe in den Leitungen von Web-Eingang zu trennen \ n suchte aus?

HTH

prost,

Du liest gerade nicht ein Byte zu einem Zeitpunkt aus der Steckdose, lesen Sie ein Byte zu einem atime aus dem C / C ++ I / O-System, das, wenn Sie CGI verwenden wird alreadety gepuffert alle Eingaben von denen haben Steckdose. Der ganze Sinn der gepufferten I / O sind die Daten zur Verfügung, die Programmierer in einer Art und Weise zu machen, die bequem für sie zu verarbeiten, wenn Sie also ein Byte zu einem Zeitpunkt, verarbeiten wollen, gehen Sie vor.

Edit: Bei näherer Betrachtung ist es aus Ihrer Frage nicht klar, ob Sie CGI implementieren oder verwenden es einfach. Man könnte dies klären, indem ein Code-Snippet zu veröffentlichen, die anzeigt, wie Sie zur Zeit, dass einzelne Byte lesen lesen.

Wenn Sie die Buchse direkt lesen, dann sollten Sie einfach lesen Sie die gesamte Antwort auf die GET in einen Puffer und dann verarbeiten. Dies hat zahlreiche Vorteile, einschließlich Leistung und einfache Codierung.

Wenn Sie einen kleinen Puffer linitted werden, dann verwenden klassische Puffer Algorithmen wie:

getbyte:
   if buffer is empty
      fill buffer
      set buffer pointer to start of buffer
   end
   get byte at buffer pointer
   increment pointer

können Sie öffnen die Socket-Datei descritpor mit dem fdopen () Funktion. Dann haben Sie gepuffert IO so können Sie fgets () aufrufen oder ähnliches auf diesem Schlagwort.

Es gibt keinen Unterschied in der Betriebssystemebene werden die Daten ohnehin gepuffert. Ihre Anwendung muss jedoch mehr Code ausführen zu „lesen“ Bytes einen nach dem anderen.

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