httpヘッダーに対して非常に基本的な処理を行う単純なhttpプロキシサーバーを作成したいと思います(つまり、ヘッダーx == yの場合、zを実行します)。サーバーは数百人のユーザーをサポートする必要がある場合があります。サーバーはC#(非常に簡単)またはc ++(はるかに難しい)で作成できます。ただし、C#バージョンはC ++バージョンと同じくらい優れたパフォーマンスを発揮しますか?そうでない場合、パフォーマンスの違いは十分に大きく、C#で記述しても意味がありませんか?
7 に答える
安全でないC#コードとポインターを重要なボトルネックポイントで使用して、実行速度を上げることができます。それらはC++コードのように動作し、実行速度が速いと思います。
しかし、ほとんどの場合、C#はすでに超高速にJITされており、誰もが言っていることとそれほど大きな違いはないと思います。
ただし、考慮したいことが1つあります。マネージコード(C#)の文字列操作は、C++でポインターを効果的に使用する場合に比べてかなり低速です。CLR文字列よりもC++ポインタの方が最適化の秘訣がたくさんあります。
以前にいくつかのベンチマークを行ったことがあると思いますが、どこに置いたか思い出せません。
なぜC++アプリケーションにはるかに高いパフォーマンスを期待するのですか?
正しく実行している場合、C#アプリケーションによって追加される固有の速度低下はありません。(ドロップされた参照が多すぎない、呼び出しごとにオブジェクトが頻繁に作成/ドロップされるなど)
C ++アプリケーションが同等のC#アプリケーションを実際に上回っているのは、(非常に)低レベルの操作を実行できる場合だけです。たとえば、生のメモリポインタ、インラインアセンブラなどをキャストします。
C ++コンパイラは高速コードの作成に優れている場合がありますが、ほとんどの場合、これはほとんどのアプリケーションで無駄になります。アプリケーションの一部が目がくらむほど高速でなければならない場合は、そのホットスポットのC呼び出しを作成してみてください。
ほとんどのシステムの動作が遅すぎる場合にのみ、C /C++での記述を検討する必要があります。ただし、C++コードのパフォーマンスを低下させる可能性のある多くの落とし穴があります。
(TLDR:C ++エキスパートはC#エキスパートとして「より速い」コードを作成する場合がありますが、平凡なC ++プログラマーは平凡なC#のものよりも遅いコードを作成する場合があります)
あなたが説明するプロキシサーバーは主に文字列データを処理するので、C#で実装するのが妥当だと思います。あなたの例では、
if header x == y, do z
最も遅い部分は実際には「z」が何であれ実行している可能性があり、言語に関係なくその作業を実行する必要があります。
私の経験では、設計と実装は、言語/フレームワークの選択よりもパフォーマンスに大きく関係しています(ただし、通常の注意事項が適用されます。たとえば、C#またはJavaでデバイスドライバーを記述しないでください)。
あなたが記述しているタイプのプログラムをマネージド言語(Java、C#など)で書くことについては、二度と考えません。最近では、(ハードウェアへの近さという点で)低水準言語を使用することで得られるパフォーマンスの向上は、管理対象環境の実行時の能力によって簡単に相殺されることがよくあります。もちろん、これはC#/ python開発者からのものなので、私は正確に偏見がありません...
高速で信頼性の高いプロキシサーバーが必要な場合は、既存のプロキシサーバーを試してみるのが理にかなっているかもしれません。ただし、必要なカスタム機能がある場合は、独自の機能を作成する必要があります。予想される負荷に関する詳細情報を収集することをお勧めします。数百人のユーザーが1分間に数回のリクエスト、または1秒に100回のリクエストになる場合があります。
1台のマシンで200qps未満または約200qpsでサービスを提供する必要があると仮定すると、C#はニーズを簡単に満たすはずです。遅いことが知られている言語(Rubyなど)でも、1秒間に数百のリクエストを簡単に送り出すことができます。
パフォーマンス以外にも、C#を選択する理由は他にもあります。たとえば、C#よりもC++でバッファオーバーフローを作成する方がはるかに簡単です。
http サーバーは専用マシンで実行されますか? はいの場合、C# の方が簡単であれば、C# を使用することをお勧めします。同じマシンで他のアプリケーションを実行する必要がある場合は、アプリケーションのメモリ フットプリントと、GC が「ランダム」な時間に実行されるという事実を考慮する必要があります。