• 締切済み

USB の通信速度計測(パフォーマンスカウンタ使用)について

こんにちは。 Windows で USB の通信速度を計測する GUI アプリを作成しています。 質問ですが、計測するにあたって USBアナライザ(LE-620HS)の結果とアプリの結果が異なっており、その理由を教えていただきたいです。 環境は、ターゲットデバイス(SH7045、M66590FP、エンドポイントバッファ512Byte)、デバイスドライバ(KMDF)、PC(WinXP SP3、Pentium D 3.19GHz、メモリ3GB)、アプリ(VC9.0 MFC)となります。 また以下に示すコードはアプリのメインスレッドではなく、データ受信を行うための、別スレッドとなります。(受信スレッド) 2048Byte のデータを Bulk IN したとき USBアナライザでは「40us」、アプリでは「400us」と 約10倍程度、差があります。 アプリの計測コードはパフォーマンスカウンタを使用しています。 LARGE_INTEGER nFreq,nBefore,nAfter; ::ZeroMemory( &nFreq, sizeof( nFreq ) ); ::ZeroMemory( &nBefore, sizeof( nBefore ) ); ::ZeroMemory( &nAfter, sizeof( nAfter ) ); QueryPerformanceFrequency( &nFreq ); QueryPerformanceCounter( &nBefore ); // 計測データを受信 // この関数は自作DLLからの呼び出しです。内部で DeviceIoControl 使用。他の複雑な処理はありません。 readData( 2048バイト受信 ); QueryPerformanceCounter( &nAfter ); DWORD dwTime = (DWORD)((nAfter.QuadPart - nBefore.QuadPart) * 1000 * 1000 / nFreq.QuadPart ); # 別スレッドでパフォーマンスカウンタを使用することが問題なのでしょうか?? 以上となります。 ご教授いただければ幸いです。

みんなの回答

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.2

それじゃあ、その400μsecにはバラつきがありますか?毎回400μsecですか? プログラムの実行にかかっている時間を計測する方向で検討されてはいかがでしょう。 readDataを0バイト受信にしたら、何もせずすぐに抜けてくるのでしょうか。 もしそうなら、そのように設定して、それで何μsecかかるのか、計測してみるとか。 パフォーマンスカウンタを使用することに特に問題はないのではと思います。

masakkii
質問者

お礼

ご回答ありがとうございます。 >それじゃあ、その400μsecにはバラつきがありますか?毎回400μsecですか? そうですね。きっちり 400μs ではないですが、大体そのくらいです。 0バイト受信での計測は盲点でした。 受信関数自体のオーバーヘッド(DeviceIoControlを含む)も考えていたところでしたので、この方法で計測してみます。 結果は後ほど報告します。

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

送信データサイズを徐々に大きくしながら、パフォーマンス計測を続けていけば、 ソフトウェア的なオーバーヘッドが原因なのかどうか、データから見えてくるんじゃないでしょうか?

masakkii
質問者

お礼

ご回答ありがとうございます。 おっしゃるとおり現状はデータサイズが小さいため、計測自体が怪しいです。 #ただターゲットデバイスの仕様で1回のデータ転送は 2048Byte 固定と #なっているため、テストにも難儀している状態です。 今回のような少量のデータサイズ受信では一瞬で処理が終わるため、パフォーマンスカウンタであっても計測が難しいのかな、と思っています。

関連するQ&A

専門家に質問してみよう