2

Winsock を使用する C++ で書かれた 2 つのプログラムがあります。どちらも TCP 接続を受け入れ、一方がデータを送信し、もう一方がデータを受信します。それらは Visual Studio 2008 でコンパイルされます。また、両方の C++ プログラムに接続し、一方から受信したパケットを転送して他方に送信する C# で記述されたプログラムもあります。その過程で、転送されたパケットの数をカウントして表示します。また、最初のパケットから最新のパケットまでの経過時間も表示されます。

パケットを送信する C++ プログラムは、まったく同じデータを送信するだけで 1000 回ループします。開発マシンで 3 つのアプリすべてを (ループバックまたは実際の IP を使用して) 実行すると、パケットは約 2 秒でシステム全体を通過します。ラボの他の PC で 3 つすべてを実行すると、常に 15 ~ 16 秒かかります。PC ごとに異なるプロセッサとメモリ容量がありますが、すべて Windows XP Professional を実行しています。私の開発用 PC には、実際には、このタスクの実行に時間がかかるマシンの半分のメモリを搭載した古い AMD Athlon が搭載されています。自分のマシンと他の 1 台のマシンのタスク マネージャーで CPU 時間のグラフを確認しましたが、これらのプログラムの実行中にどちらも大量のプロセッサ (つまり 10% 以上) を使用していません。

誰にもアイデアはありますか?ターゲットマシンにVisual Studioをインストールして、それが何か関係があるかどうかを確認することしか考えられません。

問題解決 ============================================== ====

最初に Visual Studio をインストールして、効果があるかどうかを確認しましたが、効果はありませんでした。次に、新しい開発用 PC でプログラムをテストしたところ、古い PC と同じくらい速く動作しました。Vista ラップトップでプログラムを実行すると、再び 15 秒かかりました。

サーバープログラムの特定の命令の両側にタイムスタンプを出力して、どれが最も長くかかっているかを確認したところ、遅延は1ミリ秒のSleep()メソッド呼び出しによって引き起こされていることがわかりました. 私の古いシステムと新しいシステムでは、Sleep(1) が無視されていたようです。これは、同じミリ秒で 10 から 20 を超えるパケットが送信されるためです。時折、約 15 または 16 ミリ秒の実行中断があり、1000 パケットで約 2 秒かかりました。1000 個のパケットを処理するのに約 15 秒かかったシステムでは、各パケットの送信の間に 15 ミリ秒または 16 ミリ秒のギャップがあります。

Sleep() メソッドの呼び出しをコメントアウトしたところ、パケットがすぐに送信されるようになりました。助けてくれてありがとう。

4

2 に答える 2

3

2 秒の良いケースと 15 秒のラボ ケースでアプリケーションをプロファイリングし、それらの違いを確認する必要があります。違いは、さまざまな問題 (ディスク、ウイルス対策、ネットワーク) が原因である可能性があります。それをバックアップするデータがなければ、暗闇で撮影するだけです。

プロファイラーにアクセスできない場合は、プログラムのさまざまなフェーズにタイミング インストルメンテーションを追加して、どのフェーズに時間がかかっているかを確認できます。

于 2009-08-26T20:26:21.143 に答える
0

Winsock パフォーマンス チューニング レジストリ設定を確認してみてください。ゲームまたはユーティリティのインストールによって PC の設定が調整されている可能性があります。

于 2009-08-26T20:29:52.243 に答える