質問

http ヘッダーで非常に基本的な処理を行う単純な http プロキシ サーバーを作成したいと考えています (つまり、ヘッダー x == y の場合、z を実行します)。サーバーは数百人のユーザーをサポートする必要がある場合があります。サーバーは C# (かなり簡単) または C++ (かなり難しい) で書くことができます。しかし、C# バージョンは C++ バージョンと同じくらい優れたパフォーマンスを備えているでしょうか?そうでない場合、パフォーマンスの違いは C# で記述する意味がなくなるほど大きくなりますか?

役に立ちましたか?

解決

使用できます 危険な C#コードと ポインタ 重要なボトルネックポイントを解決して、より高速に実行できるようにします。これらは C++ コードとよく似た動作をし、実行されると思います。 できるだけ早く.

しかし、ほとんどの場合、C# は既に超高速に JIT 化されており、皆さんが言っているように大きな違いはないと思います。

ただし、次のことを考慮してください。 マネージ コード (C#) の文字列操作は、C++ でポインターを効果的に使用する場合に比べてかなり遅くなります。 C++ ポインターには、CLR 文字列よりも多くの最適化テクニックがあります。

以前にいくつかのベンチマークを実行したことがあるはずですが、それをどこに置いたか思い出せません。

他のヒント

C++ アプリケーションにはるかに高いパフォーマンスを期待するのはなぜですか?

C# アプリケーションを正しく実行している場合、C# アプリケーションによって追加される固有の速度低下は発生しません。(ドロップされた参照が多すぎない、呼び出しごとに頻繁にオブジェクトの作成/ドロップが行われないなど)

C++ アプリケーションが同等の C# アプリケーションよりも実際に優れているのは、(非常に) 低レベルの操作を実行できる場合だけです。例えば。生のメモリ ポインタ、インライン アセンブラなどのキャスト。

C++ コンパイラーは高速コードの作成に優れている可能性がありますが、これはほとんどのアプリケーションで無駄になります。アプリケーションの中に本当に目がくらむほど高速でなければならない部分がある場合は、そのホットスポットに対して C 呼び出しを作成してみてください。

システムの大部分の動作が遅すぎる場合にのみ、C/C++ で記述することを検討してください。しかし、C++ コードにはパフォーマンスを低下させる可能性のある落とし穴がたくさんあります。

(TLDR:C++ の専門家は C# の専門家と同じように「高速な」コードを作成するかもしれませんが、平凡な C++ プログラマーは平凡な C# のコードよりも遅いコードを作成する可能性があります)

C# バージョンは C++ バージョンとほぼ同じくらい高速ですが、メモリ使用量は小さいと予想されます。場合によっては、マネージ コードは、最適化されていない C++ と比較して、実際にははるかに高速で、使用するメモリが少なくなります。C++ コードは専門家が作成すると高速になりますが、その努力が正当化されることはほとんどありません。

余談ですが、ブロゴスフィアにおいて、マイケル・カプラン (C#) とレイモンド・チャン (C++) の間でプログラムを作成するパフォーマンスの「競争」があったことを思い出しますが、これはまったく同じことを行います。世界最高のプログラマーの 1 人 (ジョエル) と考えられているレイモンド チャンは、コードの大部分を書き直すという長い苦労の末、より高速な C++ を書くことに成功しました。

あなたが説明したプロキシサーバーは主に文字列データを処理するため、C#で実装するのが合理的だと思います。あなたの例では、

if header x == y, do z

最も遅い部分は、実際には「z」が何であるかを実行している可能性があり、言語に関係なくその作業を実行する必要があります。

私の経験では、言語やフレームワークの選択よりも、設計と実装の方がパフォーマンスに大きく関係しています (ただし、通常の注意事項が適用されます:たとえば、C# や Java でデバイス ドライバーを作成しないでください)。

私は、あなたが記述するタイプのプログラムをマネージド言語 (Java、C# など) で書くことについて、ためらうことはありません。最近では、低レベル言語を使用することで得られるパフォーマンスの向上 (ハードウェアに近いという点で) は、管理された環境のランタイム機能によって簡単に相殺されてしまうことがよくあります。もちろん、これは C#/Python 開発者によるものなので、まったく偏見がないわけではありません...

高速で信頼性の高いプロキシ サーバーが必要な場合は、既存のプロキシ サーバーのいくつかを試してみるのが合理的かもしれません。ただし、必要なカスタム機能がある場合は、独自の機能を構築する必要がある場合があります。予想される負荷に関する詳細情報を収集することもできます。数百人のユーザーの場合、1 分あたり数リクエストの場合もあれば、1 秒あたり 100 リクエストの場合もあります。

1 台のマシンで 200 qps 以下または約 200 qps 程度の速度でサービスを提供する必要があると仮定すると、C# は、遅いことで知られる言語 (例:Ruby) は、1 秒あたり数百のリクエストを簡単に送り出すことができます。

パフォーマンス以外にも、C# を選択する理由は他にもあります。バッファ オーバーフローは、C# よりも C++ で記述する方がはるかに簡単です。

http サーバーは専用マシンで実行されますか?「はい」の場合、簡単であれば C# を使用すると思います。同じマシン上で他のアプリケーションを実行する必要がある場合は、アプリケーションのメモリ フットプリントと、GC が「ランダム」な時間に実行されるという事実を考慮する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top