La lecture à partir d'une prise de courant 1 octet de temps vs lecture en grande partie

StackOverflow https://stackoverflow.com/questions/931713

  •  06-09-2019
  •  | 
  •  

Question

Quelle est la différence - Côté performance - entre la lecture d'un socket 1 octet un temps vs lecture en grande partie

?

J'ai une application C ++ qui doit tirer des pages à partir d'un serveur Web et analyser la ligne de page reçue par ligne. À l'heure actuelle, je lis 1 octet à la fois jusqu'à ce que je rencontre un CRLF ou le maximum de 1024 octets est atteint.

Si la lecture en grande partie (par exemple 1024 octets à la fois) est beaucoup mieux sage performance, une idée sur la façon d'obtenir le même comportement que j'ai actuellement (c.-à-être en mesure de stocker et traiter 1 ligne html à un moment - jusqu'à ce que le CRLF sans consommer les octets suivants encore)

EDIT:

Je ne peux pas se permettre des tampons trop grands. Je suis dans un budget de code très serré que l'application est utilisée dans un appareil embarqué. Je préfère garder seulement une mémoire tampon de taille fixe, de préférence pour maintenir une ligne de html à la fois. Cela rend mon analyse et d'autres traitement facile que je ne suis chaque fois que je tente d'accéder à la mémoire tampon pour l'analyse, je peux supposer que je suis le traitement d'une ligne html complète.

Merci.

Était-ce utile?

La solution

Si vous lisez directement de la prise, et non à partir d'une représentation intermédiaire de niveau supérieur qui peut être tamponnées, alors sans aucun doute possible, il est tout simplement préférable de lire complètement les 1024 octets, les mettre dans la RAM dans un tampon , puis analyser les données de la RAM.

Pourquoi? La lecture sur un socket est un appel système, et il provoque un changement de contexte sur chaque lecture, ce qui est coûteux. En savoir plus sur ce: IBM Lib Tech: performances socket Boost

Autres conseils

Je ne peux pas commenter C ++, mais d'autres plates-formes - oui, cela peut faire une différence ; en particulier dans le montant des commutateurs le code doit faire, et le nombre de fois où il a besoin de se soucier de la nature des flux async etc.

Mais le vrai test est, bien sûr, au profil il. Pourquoi ne pas écrire une application de base qui barattes à travers un fichier arbitraire en utilisant les deux approches, et le tester pour certains fichiers typiques ... l'effet est généralement surprenant, si le code est lié IO. Si les fichiers sont petites et la plupart de votre temps d'exécution d'application est passé traitement les données une fois qu'il est dans la mémoire, vous n'êtes pas susceptibles de remarquer une différence.

Tout d'abord et le plus simple:

cin.getline(buffer,1024);

En second lieu, généralement tous les IO est tamponne de sorte que vous ne devez pas vous inquiéter trop

Troisièmement, le processus de CGI commencent coûte généralement beaucoup plus de traitement d'entrée (à moins qu'il est énorme fichier) ... Donc, vous pouvez tout simplement pas y penser.

G'day,

L'un des grands succès de performance en le faisant un octet à la fois est que votre contexte va de temps de l'utilisateur dans le temps du système à plusieurs reprises. Et plus. Pas efficace du tout.

Saisissant un gros morceau, généralement jusqu'à une taille MTU, est plus efficace de façon mesurable.

Pourquoi ne pas analyser le contenu dans un vecteur et itérer sur cette recherche pour \ n de séparer votre entrée dans les lignes d'entrée Web?

HTH

Cheers,

Vous ne lisez pas un octet à la fois d'une prise, vous lisez un octet à atime du système C / C ++ E / S, qui, si vous utilisez CGI aura alreadety tamponne toute l'entrée de la prise. Le point entier d'E / S en mémoire tampon est de rendre les données disponibles pour le programmeur d'une manière qui leur convient pour traiter, donc si vous voulez traiter un octet à la fois, allez-y.

Modifier À la réflexion, il ne ressort pas de votre question si vous implémentez CGI ou tout simplement l'utiliser. Vous pouvez préciser cela en affichant un extrait de code qui indique comment vous lisez en cours de lecture que seul octet.

Si vous lisez la prise directement, alors vous devriez simplement lire toute la réponse à l'EEG dans un tampon et traiter ensuite. Cela a de nombreux avantages, dont la performance et la facilité de codage.

Si vous linitted à un petit tampon, puis utiliser des algorithmes de mise en mémoire tampon classiques comme:

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

Vous pouvez ouvrir le fichier socket descritpor avec la fonction fdopen (). Ensuite, vous avez IO en mémoire tampon afin que vous puissiez appeler fgets () ou similaire sur ce descripteur.

Il n'y a pas de différence au niveau du système d'exploitation, les données sont mises en mémoire tampon de toute façon. Votre demande doit cependant exécuter plus de code pour « lire » octets un à la fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top