2008-08-27 29 views
3

Je souhaite créer un serveur proxy http simple qui effectue un traitement très basique sur les en-têtes http (c'est-à-dire si l'en-tête x == y, do z). Le serveur peut devoir 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 autant de performance qu'une version C++? Si ce n'est pas le cas, la différence de performance serait-elle suffisamment importante pour qu'il ne soit pas logique de l'écrire en C#?Performances C# pour serveur proxy (vs C++)

Répondre

3

Vous pouvez utiliser dangereux code C# et pointeurs en points de goulot d'étranglement critiques pour le faire fonctionner plus rapidement. Ceux-ci se comportent comme le code C++ et je crois qu'il exécute aussi vite que.

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

Mais une chose que vous pourriez vouloir considérer est: Les opérations de chaîne de code managé (C#) sont plutôt lentes comparées à l'utilisation efficace de pointeurs en C++. Il existe d'autres astuces d'optimisation avec des pointeurs C++ qu'avec des chaînes CLR.

Je pense que j'ai déjà fait quelques benchmarks, mais je ne me souviens plus où je les ai mis.

0

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

la partie la plus lente peut effectivement faire ce que « z » est et vous devrez faire ce travail quelle que soit la langue.

2

Pourquoi pensez-vous que les performances de l'application C++ seront beaucoup plus élevées?

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

La seule fois où une application C++ surclasse vraiment une application C# équivalente, c'est quand vous pouvez effectuer des opérations (très) de bas niveau. Par exemple. lancer des pointeurs mémoire bruts, assembleur en ligne, etc

Le compilateur C++ peut être meilleur à créer du code rapide, mais la plupart du temps cela est gaspillé dans la plupart des applications. Si vous avez vraiment une partie de votre application qui doit être incroyablement rapide, essayez d'écrire un appel C pour ce point chaud.

Seulement si la plupart du système se comporte trop lentement, vous devriez envisager de l'écrire en C/C++. Mais il existe de nombreux pièges qui peuvent tuer votre performance dans votre code C++.

(TLDR: Un C de l'expert peut créer un code 'plus rapide' comme un expert C#, mais un programmeur C++ médiocre peut créer un code plus lent que médiocre C# un)

0

Dans mon expérience, la conception et la mise en œuvre a beaucoup plus à faire avec la performance que le choix du langage/cadre (cependant, les mises en garde habituelles s'appliquent: par exemple, n'écrivez pas un pilote de périphérique en C# ou java). Je n'aurais pas hésité à é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 performance que vous obtenez en utilisant un langage de niveau inférieur (en termes de proximité du matériel) sont souvent facilement compensés par les capacités d'exécution d'un environnement géré. Bien sûr, cela provient d'un développeur C#/python, donc je ne suis pas exactement impartial ...

0

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 vous avez des fonctionnalités personnalisées requises, vous devrez peut-être créer les vôtres. Vous voudrez peut-être recueillir plus d'informations sur la charge attendue: des centaines d'utilisateurs pourraient être quelques demandes une minute ou une centaine de demandes par seconde. En supposant que vous ayez besoin de 200 s/s sur une seule machine, C# devrait facilement répondre à vos besoins - même les langues connues pour être lentes (par exemple Ruby) peuvent facilement pomper 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épassements de tampon en C++ que C#.

1

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

En note de fond je me souviens d'une performance "compétition" 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, qui est considéré comme l'un des meilleurs programmeurs au monde (Joel) a réussi à écrire plus vite en C++ après une longue lutte pour réécrire la majeure partie du code.

0

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