ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:masakkii 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 );

# 別スレッドでパフォーマンスカウンタを使用することが問題なのでしょうか??

以上となります。
ご教授いただければ幸いです。
質問投稿日時:09/10/21 10:57
質問番号:5384395
最新から表示回答順に表示

回答

 

回答者:hidebun それじゃあ、その400μsecにはバラつきがありますか?毎回400μsecですか?
プログラムの実行にかかっている時間を計測する方向で検討されてはいかがでしょう。
readDataを0バイト受信にしたら、何もせずすぐに抜けてくるのでしょうか。
もしそうなら、そのように設定して、それで何μsecかかるのか、計測してみるとか。
パフォーマンスカウンタを使用することに特に問題はないのではと思います。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:09/10/23 05:28
回答番号:No.2
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼ご回答ありがとうございます。

>それじゃあ、その400μsecにはバラつきがありますか?毎回400μsecですか?
そうですね。きっちり 400μs ではないですが、大体そのくらいです。

0バイト受信での計測は盲点でした。
受信関数自体のオーバーヘッド(DeviceIoControlを含む)も考えていたところでしたので、この方法で計測してみます。

結果は後ほど報告します。

回答

 

回答者:hidebun 送信データサイズを徐々に大きくしながら、パフォーマンス計測を続けていけば、
ソフトウェア的なオーバーヘッドが原因なのかどうか、データから見えてくるんじゃないでしょうか?
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:09/10/21 17:40
回答番号:No.1
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼ご回答ありがとうございます。

おっしゃるとおり現状はデータサイズが小さいため、計測自体が怪しいです。
#ただターゲットデバイスの仕様で1回のデータ転送は 2048Byte 固定と
#なっているため、テストにも難儀している状態です。

今回のような少量のデータサイズ受信では一瞬で処理が終わるため、パフォーマンスカウンタであっても計測が難しいのかな、と思っています。
最新から表示回答順に表示