Sérialisation et désérialisation des données .NET Core vs Go

Salut% username%


Ma tùche consistait à comparer les performances de sérialisation pour .NET Core et Golang. AprÚs avoir cherché sur Internet, je suis tombé sur un référentiel . Un exemple simple d'un microservice REST est considéré. C'est exactement ce dont j'ai besoin, pensai-je. AprÚs avoir vu les résultats des tests, j'ai été surpris. AprÚs avoir regardé le code source, j'ai réalisé ce qui n'allait pas. Voici ce que je n'ai pas aimé:


  • Pour la sĂ©rialisation et la dĂ©sĂ©rialisation, un tableau de 3 Ă©lĂ©ments est sĂ©lectionnĂ©. Ce n'est clairement pas suffisant.
  • Pour Golang, toutes les fonctionnalitĂ©s du langage ne sont pas utilisĂ©es, mais, comme vous le savez, la bibliothĂšque intĂ©grĂ©e d'encodage / json est lente.
  • En consĂ©quence, l'auteur compare les performances des serveurs Web kestrel et net / http.

Ce sont ces lacunes qui ont conduit à un examen plus détaillé des performances dans le cadre de l'exemple décrit ci-dessus. J'espÚre que vous trouvez intéressant de connaßtre les résultats.


Composition et description du logiciel


Le code source du référentiel ci-dessus a également été pris comme base. Ce qui a été finalisé:


  • Pour l'API serveur, fasthttp est utilisĂ©.
  • Le serveur API rĂ©pond avec des tableaux d'enregistrements.
  • Chaque client dispose de plusieurs mĂ©thodes de vĂ©rification.

Le code modifié est disponible dans le référentiel .


Pour plus de clarté, un exemple de réponse JSON de l'API du serveur:


[ { "Id":"id_8299119732867115081", "Name":"name_5541535679032008745", "Time":1566731141 }, ... { "Id":"id_2804604318195309547", "Name":"name_5914011395631118540", "Time":1566731142 } ] 

Les clients


Pour Ă©valuer les performances de chaque service, trois mĂ©thodes sont mises en Ɠuvre:


  • recevoir des donnĂ©es de l'API du serveur et les envoyer sans traitement [/ testNoProcess].
  • recevoir des donnĂ©es de l'API du serveur - dĂ©sĂ©rialisation, sĂ©rialisation en utilisant la rĂ©flexion et l'envoi [/ testReflection]. Pour .NETCore, le package Newtonsoft.Json a Ă©tĂ© utilisĂ©, pour Golang, le codage / json a Ă©tĂ© utilisĂ©.
  • recevoir des donnĂ©es de l'API du serveur - dĂ©sĂ©rialisation, sĂ©rialisation sans utiliser la rĂ©flexion et l'envoi [/ testNoReflection]. Pour .NETCore, une solution basĂ©e sur Span a Ă©tĂ© implĂ©mentĂ©e pour minimiser le nombre d'allocations de mĂ©moire. Golang a une solution toute faite - la bibliothĂšque easyjson , qui a fait ses preuves exclusivement du cĂŽtĂ© positif.

Sur la base de ces tests, vous pouvez évaluer les performances relatives des serveurs Web (kestrel et net / http), la baisse des performances lors du traitement des données en utilisant la réflexion et sans elle pour les implémentations dans les deux langues.


Description de la méthodologie de test


Les tests ont été effectués en plusieurs étapes afin d'évaluer les performances de chaque langue et de chaque implémentation.
Pour crĂ©er une charge, l'utilitaire bombardier a Ă©tĂ© sĂ©lectionnĂ©. L'utilitaire a Ă©tĂ© lancĂ© avec les paramĂštres suivants: -c 125 –d 120s, qui peut ĂȘtre interprĂ©tĂ© comme suit: comment utiliser 125 threads avec un temps de test de 120 secondes.


La mesure des performances a été réalisée en 3 étapes:


  1. Dimension du serveur API RPS. Les mesures ont été effectuées afin de pouvoir évaluer l'influence des méthodes de traitement sur les performances de chaque méthode.
  2. Mesure RPS du traitement des réponses par réflexion.
  3. Mesurer le traitement des réponses RPS sans utiliser de réflexion.

Sur la base de ces mesures, des donnĂ©es ont Ă©tĂ© obtenues sur les performances du traitement des rĂ©ponses. L'utilisation de tous les cƓurs de processeur Ă©tait de 99,8 Ă  100%. Pour l'Ă©valuation, les donnĂ©es initiales de 10, 30, 100 et 500 enregistrements ont Ă©tĂ© sĂ©lectionnĂ©es. Les tableaux de 500 enregistrements en production ne sont pas courants, mais j'Ă©tais intĂ©ressĂ© de voir comment chacune des langues se comportait.


Banc d'essai


Tous les tests ont été exécutés sur une machine virtuelle exécutant Ubuntu Server 18.04 avec toutes les mises à jour pour août 2019. Il présente les caractéristiques suivantes:


  • Processeur Core I7-3770K - 4 cƓurs.
  • RAM - 4 Go.

Pour comparer les performances, .NET Core 2.2 et Golang 1.12 ont été installés.


Eh bien, il est maintenant temps de passer au plus intéressant - les résultats.


RĂ©sultats


Voici un tableau avec les résultats des tests.


alt text


Vous pouvez immédiatement remarquer que Golang a un serveur Web plus productif. La différence est d'environ 12% par rapport à Kestrel dans .NET Core.
Sur la base des données ci-dessus, 2 graphiques ont été construits. Ensuite, vous pouvez voir clairement la comparaison des RPS.


alt text


En raison de la bibliothÚque net / http plus rapide, Golang affiche de bons résultats pour les petites données. Avec une augmentation du volume de données, les performances sont comparées à Kestrel.


Lorsque vous utilisez la rĂ©flexion sur une petite taille de donnĂ©es, le RPS est approximativement le mĂȘme, compte tenu de l'erreur de mesure. Avec l'augmentation de la taille des donnĂ©es, .NET Core affiche plus de RPS.


Lors des tests sans utilisation de la rĂ©flexion, les deux langues ont montrĂ© un gain de performances. Golang affiche de meilleures performances car il a initialement un RPS plus Ă©levĂ© (requĂȘtes par seconde) sur les tests sans traitement. Sur les petites donnĂ©es, l'avantage est significatif. Avec l'augmentation de la taille des donnĂ©es, RPS est presque comparĂ©. Sur le plus gros test de 500 records, Golang est de nouveau en tĂȘte.


alt text


Lors des tests utilisant la rĂ©flexion, Golang a perdu sur tous les fronts. La baisse des performances dans les pires scĂ©narios Ă©tait supĂ©rieure Ă  60%. L'implĂ©mentation de la sĂ©rialisation prĂȘte Ă  l'emploi pour les performances est gĂ©nĂ©ralement sans valeur.
Sans rĂ©flexion, Golang a Ă©tĂ© plus rapide dans tous les tests. Et avec la croissance des donnĂ©es, l'avantage de Golang ne fait que croĂźtre. Dans tous les cas, le refus d'utiliser la rĂ©flexion donne une amĂ©lioration significative des performances Ă  la fois pour Golang et .NETCore, ce qui, en gĂ©nĂ©ral, devrait ĂȘtre attendu.


Conclusions


Quelles conclusions peut-on tirer de cette petite comparaison de performances? Je voudrais formuler cela sous la forme d'avantages et d'inconvénients pour chacune des solutions. Commençons par Golang:


  • Il a de meilleures performances et peut ĂȘtre encore amĂ©liorĂ©, par exemple, en utilisant fasthttp comme serveur Web.
  • GrĂące Ă  la gĂ©nĂ©ration de code - utilisation pratique des mĂ©thodes de traitement sans rĂ©flexion.
  • Moins de consommation de mĂ©moire.

.NET Core présente également plusieurs avantages:


  • Les performances conviennent Ă  la plupart des cas.
  • À mon avis, c'est l'un des environnements de dĂ©veloppement les meilleurs et les plus pratiques pour Visual Studio.

Le rĂ©sultat peut ĂȘtre rĂ©sumĂ© comme suit: si vous avez une API REST et que vous prĂ©voyez une charge importante, une logique mĂ©tier pas trop compliquĂ©e, il est prĂ©fĂ©rable d'utiliser Golang, dans d'autres cas, vous pouvez le faire avec .NET Core. Dois-je rĂ©Ă©crire des solutions prĂȘtes Ă  l'emploi de .NET Core vers Golang? Chacun dĂ©cidera pour lui-mĂȘme.


J'espÚre que vous trouverez ce matériel utile. Tout va bien

Source: https://habr.com/ru/post/fr469271/


All Articles