1 points par GN⁺ 2023-11-06 | 1 commentaires | Partager sur WhatsApp
  • Article sur le processus de construction d’un parseur JSON haute performance en utilisant le langage Go
  • Projet visant à prendre en charge le streaming, à être compatible avec le package encoding/json et à proposer une API sans allocation ou à allocations limitées
  • Article expliquant la complexité temporelle du parsing JSON et soulignant que la borne inférieure du temps nécessaire pour traiter l’entrée est la taille de cette entrée
  • Article sur le processus de tokenisation qui transforme un flux d’octets en flux de tokens JSON
  • Article expliquant le processus de lecture des données depuis un fichier JSON et mettant en avant les difficultés liées à l’utilisation de io.Reader
  • L’auteur présente le concept de byteReader, qui fonctionne de manière similaire à bufio.Reader mais avec une API plus efficace
  • Article sur le processus de scan permettant d’identifier quels caractères sont des tokens et lesquels sont simplement des espaces
  • L’auteur explique comment améliorer les performances du scanner en évitant les appels de fonction sur le hot path
  • Article sur le processus de décodage qui vérifie si une séquence de tokens est valide
  • L’auteur suggère qu’il est possible d’améliorer les performances du décodeur en utilisant un goto calculé, en stockant directement les méthodes et en les appelant directement

1 commentaires

 
GN⁺ 2023-11-06
Avis Hacker News
  • Un article proposant un guide détaillé pour construire un parseur JSON haute performance
  • L’auteur suggère qu’une tokenisation explicite n’est pas nécessaire pour JSON et que le parsing peut être fusionné avec la tokenisation
  • L’auteur recommande d’éviter les allocations sur le heap lors de la tokenisation et du parsing pour obtenir de meilleures performances
  • Le choix de la bibliothèque JSON peut avoir un impact majeur sur les performances, avec des écarts pouvant aller jusqu’à 3 à 10 fois
  • Si les classes à sérialiser ou désérialiser sont connues à la compilation, Jackson Java fonctionne bien, mais l’article suggère qu’un code soigné et du profiling peuvent doubler les performances
  • Pour les environnements de production à haute performance, l’auteur recommande d’examiner les travaux de Daniel Lemire ou leur portage en Go par MinIO
  • L’auteur mentionne également la page de benchmarks JSON de RapidJSON
  • Il discute d’une solution au problème de « l’usine à déchets » dans la tokenisation, qui consiste à utiliser des fonctions allant de byteslice vers T plutôt que des chaînes de caractères
  • L’auteur mentionne une approche similaire utilisée pour construire un tokenizer et un parseur GraphQL très rapides et sans allocation mémoire
  • L’auteur évoque aussi le computed goto, une technique plus efficace en espace
  • L’auteur suggère que la bibliothèque standard pourrait être améliorée avec une meilleure conception d’API, mais qu’un parseur entièrement streaming qui ne remplit qu’à moitié la structure avant de trouver une erreur est irréaliste
  • L’auteur n’est pas d’accord avec l’idée qu’il serait irréaliste, pour la plupart des applications, de s’attendre à avoir toute l’entrée en mémoire
  • L’article remercie Phil Pearl et recommande de jeter un œil à la bibliothèque Sonic sur GitHub