2

私はこの投稿を見ましたが、それは私の質問に答えません:C / Pythonソケットパフォーマンス?

私は、ソケットに基づいて何千もの接続を作成できるアプリケーションの作成を任されています。Pythonでこれを行うことはできますが、パフォーマンスを改善する余地があります。私の過去のプロジェクトのおかげでPythonでそれが可能であることは知っていますが、このプロジェクトをC(C ++ではなく)で行うとしたら、これがどれだけパフォーマンスの向上になるのか興味がありますか?

4

2 に答える 2

6

それは本当にあなたがソケットで何をしているのかに依存します。

最良の一般的な答えは次のとおりです。通常、Pythonは問題にならないほど十分ですが、そうでない場合もあります。

ソケットの作成と接続にかかる時間のオーバーヘッドは最小限であり、読み取りと書き込みはそれほど悪くありません。しかし、それは問題ではありません。とにかく、それを行うのにかなりの時間が費やされることはほとんどありません。

Pythonには、Cで使用できる汎用のものと同じくらい優れたリアクターとプロクターがあります(Cライブラリーの半分にはPythonバインディングがあります)。ソケット以外でそれほど重要な作業を行っていない場合、これが主なボトルネックになることがよくあります。非常に特殊な使用パターンや非常に厳密に指定されたハードウェアがある場合は、汎用のあらゆるものを打ち負かすカスタムリアクターまたはプロクターを作成できる可能性があります。その場合、PythonではなくCを使用する必要があります。

しかし、通常は、ソケットを操作するだけでなく、かなりの作業を行う必要があります。

その作業がほとんど独立していて高度に並列化できる場合、ジョブがマルチプロセスできるほど重い場合を除いて、Cは明らかにPythonよりも優れています(そして「十分に重い」はWindowsではかなり重い可能性があることに注意してください)プラットフォーム)。もちろん、マルチスレッドCコードの記述でパフォーマンス(安定性は言うまでもなく)を台無しにするのが信じられないほど簡単であることを除いて。実際、ErlangやHaskellのようなものは、おそらくCやPythonよりもここでの方が良いでしょう。(「しかし、Cの経験はあるが、Haskellを学ぶことができない人々がいる」と言えば、それらの人々はおそらくマルチスレッドコードを書くのに十分なプログラマーではありません。)

その作業のほとんどがソケットバッファ間のメモリコピーであり、厳密に指定されたシステムを処理できる場合は、ゼロコピーを最適化するCコードを記述できる可能性があり、Pythonでそれを行う方法はありません。

しかし、ディスクでの待機やシリアル化された計算など、ほとんどの場合、実際のコードで待機することになるため、ソケットの記述方法はほとんど問題になりません。

したがって、これ以上の情報がなければ、Pythonを使用します。これは、Cと比較して、起動して実行およびデバッグする時間を節約するために、重要なことが判明したものを最適化または改善するために費やすことができるためです。

于 2012-09-20T22:49:22.597 に答える
0

Windowsプラットフォームを使用している場合は、IOCPのコアごとに1つのスレッドの概念を学び、ソケットの使用ごとに多かれ少なかれ1つのスレッドを必要とするスレッドプールを使用しないようにします。

于 2012-10-11T22:17:13.313 に答える