Frage

Ich möchte einen einfachen HTTP-Proxyserver erstellen, der einige sehr grundlegende Verarbeitungsvorgänge für die HTTP-Header durchführt (z. B.Wenn Header x == y, mache z).Der Server muss möglicherweise Hunderte von Benutzern unterstützen.Ich kann den Server in C# (ziemlich einfach) oder C++ (viel schwieriger) schreiben.Hätte eine C#-Version jedoch eine ebenso gute Leistung wie eine C++-Version?Wenn nicht, wäre der Leistungsunterschied so groß, dass es keinen Sinn macht, ihn in C# zu schreiben?

War es hilfreich?

Lösung

Sie können verwenden unsicher C#-Code und Hinweise an kritischen Engpasspunkten, um die Ausführung zu beschleunigen.Diese verhalten sich ähnlich wie C++-Code und ich glaube, dass er ausgeführt wird so schnell.

Aber die meiste Zeit ist C# bereits JIT-fähig und extrem schnell. Ich glaube nicht, dass es große Unterschiede zu dem geben wird, was alle gesagt haben.

Aber eine Sache, die Sie vielleicht berücksichtigen sollten, ist: String-Operationen mit verwaltetem Code (C#) sind im Vergleich zur effektiven Verwendung von Zeigern in C++ eher langsam. Bei C++-Zeigern gibt es mehr Optimierungstricks als bei CLR-Strings.

Ich glaube, ich habe schon einige Benchmarks durchgeführt, kann mich aber nicht erinnern, wo ich sie platziert habe.

Andere Tipps

Warum erwarten Sie eine viel höhere Leistung von der C++-Anwendung?

Wenn Sie es richtig machen, verursacht eine C#-Anwendung keine inhärente Verlangsamung.(nicht zu viele gelöschte Referenzen, häufiges Erstellen/Löschen von Objekten pro Aufruf usw.)

Eine C++-Anwendung übertrifft eine entsprechende C#-Anwendung nur dann wirklich, wenn Sie Operationen auf (sehr) niedriger Ebene ausführen können.Z.B.Umwandeln von rohen Speicherzeigern, Inline-Assembler usw.

Der C++-Compiler ist vielleicht besser darin, schnellen Code zu erstellen, aber in den meisten Anwendungen wird dieser meist verschwendet.Wenn Sie wirklich einen Teil Ihrer Anwendung haben, der unglaublich schnell sein muss, versuchen Sie, einen C-Aufruf für diesen Hotspot zu schreiben.

Nur wenn sich der Großteil des Systems zu langsam verhält, sollten Sie darüber nachdenken, es in C/C++ zu schreiben.Es gibt jedoch viele Fallstricke, die die Leistung Ihres C++-Codes beeinträchtigen können.

(TLDR:Ein C++-Experte erstellt möglicherweise „schnelleren“ Code als ein C#-Experte, aber ein mittelmäßiger C++-Programmierer erstellt möglicherweise langsameren Code als ein mittelmäßiger C#-Experte.

Ich würde erwarten, dass die C#-Version fast so schnell wie die C++-Version ist, aber einen geringeren Speicherbedarf hat.In einigen Fällen ist verwalteter Code tatsächlich VIEL schneller und benötigt weniger Speicher im Vergleich zu nicht optimiertem C++.C++-Code kann schneller sein, wenn er von Experten geschrieben wird, aber er rechtfertigt selten den Aufwand.

Als Randbemerkung kann ich mich an einen Leistungs-„Wettbewerb“ in der Blogosphäre zwischen Michael Kaplan (c#) und Raymond Chan (C++) erinnern, bei dem es darum ging, ein Programm zu schreiben, das genau das Gleiche tut.Raymond Chan, der als einer der besten Programmierer der Welt gilt (Joel), gelang es, schnelleres C++ zu schreiben, nachdem er lange darum gekämpft hatte, den größten Teil des Codes neu zu schreiben.

Der von Ihnen beschriebene Proxyserver würde sich hauptsächlich mit Zeichenfolgendaten befassen, und ich denke, dass es sinnvoll ist, ihn in C# zu implementieren.In deinem Beispiel,

if header x == y, do z

Der langsamste Teil besteht möglicherweise darin, das zu tun, was auch immer „z“ ist, und Sie müssen diese Arbeit unabhängig von der Sprache erledigen.

Meiner Erfahrung nach haben Design und Implementierung viel mehr mit der Leistung zu tun als mit der Wahl der Sprache/des Frameworks (allerdings gelten die üblichen Einschränkungen:Schreiben Sie beispielsweise keinen Gerätetreiber in C# oder Java.

Ich würde nicht zweimal darüber nachdenken, die Art von Programm, die Sie beschreiben, in einer verwalteten Sprache zu schreiben (sei es Java, C# usw.).Heutzutage werden die Leistungsgewinne, die Sie durch die Verwendung einer Sprache auf niedrigerem Niveau (in Bezug auf die Nähe zur Hardware) erzielen, oft leicht durch die Laufzeitfähigkeiten einer verwalteten Umgebung ausgeglichen.Das kommt natürlich von einem C#/Python-Entwickler, daher bin ich nicht gerade unvoreingenommen ...

Wenn Sie einen schnellen und zuverlässigen Proxyserver benötigen, kann es sinnvoll sein, einige der bereits vorhandenen auszuprobieren.Wenn Sie jedoch über benutzerdefinierte Funktionen verfügen, die erforderlich sind, müssen Sie möglicherweise Ihre eigenen erstellen.Möglicherweise möchten Sie weitere Informationen zur erwarteten Auslastung sammeln:Bei Hunderten von Benutzern kann es sich um ein paar Anfragen pro Minute oder hundert Anfragen pro Sekunde handeln.

Angenommen, Sie müssen weniger oder etwa 200 qps auf einem einzelnen Computer bereitstellen, sollte C# Ihre Anforderungen problemlos erfüllen – selbst Sprachen, die dafür bekannt sind, langsam zu sein (z. B.Ruby) kann problemlos ein paar Hundert Anfragen pro Sekunde abwickeln.

Abgesehen von der Leistung gibt es noch andere Gründe, sich für C# zu entscheiden, z.Es ist viel einfacher, Pufferüberläufe in C++ als in C# zu schreiben.

Wird Ihr http-Server auf einem dedizierten Rechner laufen?Wenn ja, würde ich C# empfehlen, wenn es für Sie einfacher ist.Wenn Sie andere Anwendungen auf demselben Computer ausführen müssen, müssen Sie den Speicherbedarf Ihrer Anwendung und die Tatsache berücksichtigen, dass GC zu „zufälligen“ Zeiten ausgeführt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top