Maison  >  Article  >  Java  >  Comment implémenter des E/S délimitées par tampons de protocole en C : fonctionnalités manquantes et optimisations potentielles

Comment implémenter des E/S délimitées par tampons de protocole en C : fonctionnalités manquantes et optimisations potentielles

Patricia Arquette
Patricia Arquetteoriginal
2024-11-03 06:44:30434parcourir

 How to Implement Protocol Buffers Delimited I/O in C  : Missing Functionality and Potential Optimizations

Équivalents C pour les fonctions d'E/S délimitées des tampons de protocole en Java

Dans les tampons de protocole, l'ajout de préfixes de longueur avant les messages est essentiel pour la lecture et écrire plusieurs messages à partir de fichiers. Alors que Java dispose de fonctions d'E/S « délimitées » (par exemple, parseDelimitedFrom, mergeDelimitedFrom, writeDelimitedTo) à cet effet, C ne dispose pas de fonctions équivalentes.

Recommandation de Google

Google recommande attacher manuellement des préfixes de longueur aux messages en C . Cela implique :

  • Écrire la taille du message sous forme de variante
  • Sérialiser le message dans un tampon

Cependant, cette approche manque d'optimisations et peut échouer pour entrées supérieures à 64 Mo.

Implémentations C optimisées

Par la suite, des implémentations C optimisées ont été développées et partagées par un ancien auteur de la bibliothèque protobuf de Google. Ces implémentations incluent :

  • Écrire la taille sous forme de variante
  • Utiliser la méthode GetDirectBufferForNBytesAndAdvance pour une sérialisation efficace
  • Application d'une limite de taille par message de 64 Mo

Détails d'implémentation

La fonction writeDelimitedTo crée un nouveau CodedOutputStream pour chaque message et le sérialise à l'aide de la méthode SerializeWithCachedSizes. Si le message tient dans un seul tampon, la méthode SerializeWithCachedSizesToArray plus rapide est utilisée.

La fonction readDelimitedFrom crée un nouveau CodedInputStream et impose une limite de taille par message à l'aide de la méthode PushLimit. Il analyse ensuite le message à l'aide de la méthode MergeFromCodedStream et vérifie que l'intégralité du message a été consommée.

Disponibilité

Ces implémentations C optimisées ne font pas partie de la bibliothèque officielle protobuf. Cependant, ils peuvent être trouvés dans divers référentiels tiers ou implémentés manuellement à l'aide des extraits de code fournis.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn