Question

Je souhaite créer un simple serveur proxy http qui effectue un traitement très basique sur les en-têtes http (c'est-à-diresi en-tête x == y, faites z).Le serveur devra peut-être prendre en charge des centaines d'utilisateurs.Je peux écrire le serveur en C# (assez facile) ou en C++ (beaucoup plus difficile).Cependant, une version C# aurait-elle d’aussi bonnes performances qu’une version C++ ?Sinon, la différence de performances serait-elle suffisamment grande pour qu’il ne soit pas logique de l’écrire en C# ?

Était-ce utile?

La solution

Vous pouvez utiliser peu sûr Code C# et pointeurs dans les points critiques de goulot d'étranglement pour le rendre plus rapide.Ceux-ci se comportent un peu comme du code C++ et je crois qu'il s'exécute aussi vite.

Mais la plupart du temps, C# est déjà ultra-rapide, je ne pense pas qu'il y aura beaucoup de différences comme avec ce que tout le monde a dit.

Mais une chose que vous voudrez peut-être considérer est la suivante : Les opérations sur les chaînes de code managé (C#) sont plutôt lentes par rapport à l’utilisation efficace de pointeurs en C++. Il existe plus d'astuces d'optimisation avec les pointeurs C++ qu'avec les chaînes CLR.

Je pense avoir déjà fait quelques benchmarks, mais je ne me souviens plus où je les ai placés.

Autres conseils

Pourquoi attendez-vous des performances bien supérieures de la part de l’application C++ ?

Il n'y a aucun ralentissement inhérent ajouté par une application C# lorsque vous le faites correctement.(pas trop de références supprimées, création/suppression d'objets fréquentes par appel, etc.)

La seule fois où une application C++ surpasse réellement une application C# équivalente, c'est lorsque vous pouvez effectuer des opérations de (très) bas niveau.Par exemple.casting de pointeurs de mémoire brute, assembleur en ligne, etc.

Le compilateur C++ est peut-être plus efficace pour créer du code rapide, mais cela est généralement inutile dans la plupart des applications.Si une partie de votre application doit vraiment être incroyablement rapide, essayez d'écrire un appel C pour ce point chaud.

Ce n'est que si la majeure partie du système se comporte trop lentement que vous devriez envisager de l'écrire en C/C++.Mais il existe de nombreux pièges qui peuvent nuire à vos performances dans votre code C++.

(TLDR :Un expert C++ peut créer du code « plus rapide » en tant qu'expert C#, mais un programmeur C++ médiocre peut créer un code plus lent qu'un programmeur C# médiocre.)

Je m'attendrais à ce que la version C# soit presque aussi rapide que celle C++ mais avec une empreinte mémoire plus petite.Dans certains cas, le code managé est en réalité BEAUCOUP plus rapide et utilise moins de mémoire que le C++ non optimisé.Le code C++ peut être plus rapide s’il est écrit par un expert, mais il justifie rarement l’effort.

En passant, je me souviens d'un "concours" de performance dans la blogosphère entre Michael Kaplan (c#) et Raymond Chan (C++) pour écrire un programme, qui fait exactement la même chose.Raymond Chan, considéré comme l'un des meilleurs programmeurs au monde (Joel), a réussi à écrire du C++ plus rapidement après une longue lutte pour réécrire la majeure partie du code.

Le serveur proxy que vous décrivez traiterait principalement des données de chaîne et je pense qu'il est raisonnable de l'implémenter en C#.Dans votre exemple,

if header x == y, do z

la partie la plus lente pourrait en fait être de faire le « z » et vous devrez faire ce travail quelle que soit la langue.

D'après mon expérience, la conception et la mise en œuvre ont beaucoup plus à voir avec les performances que le choix du langage/du framework (cependant, les mises en garde habituelles s'appliquent :par exemple, n'écrivez pas de pilote de périphérique en C# ou Java).

Je n'hésiterais pas à écrire le type de programme que vous décrivez dans un langage géré (que ce soit Java, C#, etc.).De nos jours, les gains de performances que vous obtenez en utilisant un langage de niveau inférieur (en termes de proximité avec le matériel) sont souvent facilement compensés par les capacités d'exécution d'un environnement géré.Bien sûr, cela vient d'un développeur C#/python donc je ne suis pas vraiment impartial...

Si vous avez besoin d’un serveur proxy rapide et fiable, il peut être judicieux d’essayer certains de ceux qui existent déjà.Mais si des fonctionnalités personnalisées sont requises, vous devrez peut-être créer les vôtres.Vous souhaiterez peut-être collecter plus d'informations sur la charge attendue :des centaines d'utilisateurs peuvent représenter quelques requêtes par minute ou une centaine de requêtes par seconde.

En supposant que vous ayez besoin de servir moins de 200 qps ou environ sur une seule machine, C# devrait facilement répondre à vos besoins, même dans les langages connus pour être lents (par ex.Ruby) peut facilement émettre quelques centaines de requêtes par seconde.

Outre les performances, il existe d'autres raisons de choisir C#, par ex.il est beaucoup plus facile d'écrire des débordements de tampon en C++ qu'en C#.

Votre serveur http va-t-il fonctionner sur une machine dédiée ?Si oui, je dirais d'opter pour C# si c'est plus facile pour vous.Si vous devez exécuter d'autres applications sur la même machine, vous devrez prendre en compte l'empreinte mémoire de votre application et le fait que GC s'exécutera à des moments « aléatoires ».

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