none
PdhAddCounterが遅い RRS feed

  • 質問

  • 下記のコードをVisual C++ 2010 Expressでビルドし実行しました。

    プログラムは成功するのですがPdhAddCounterの処理に必ず6秒程かかります。

    何か間違いがあるのでしょうか?

    今確認できている発生条件は

    Win 7 pro(64bit)とXP pro(32bit)上で実行、時間がかかったのは7のみ

    7で時間がかかる場合も

     コンソールアプリケーションで作成した場合、又は

     Win32プロジェクトで作り、実行時にcmd等から [ it.exe | more ]のようにリダイレクトした場合

    で標準出力先がない場合は時間がかからないみたいです。

    #include "stdafx.h" #include<windows.h> #include<iostream> #include<pdh.h> int _tmain(int argc, _TCHAR* argv[]) { #ifdef UNICODE decltype(std::wcout) &_tcout = std::wcout; decltype(std::wcin) &_tcin = std::wcin; #else decltype(std::cout) &_tcout = std::cout; decltype(std::cin) &_tcin = std::cin; #endif PDH_HQUERY hQuery; PDH_HCOUNTER hCounter; PDH_FMT_COUNTERVALUE fntValue; if ( PdhOpenQuery(NULL,0,&hQuery) == ERROR_SUCCESS ){ _tcout << __LINE__ << ":PdhOpenQuery" << std::endl; PdhAddCounter( hQuery, TEXT("\\Processor(_total)\\% Processor Time"), 0, &hCounter ); _tcout << __LINE__ << ":PdhAddCounter" << std::endl; PdhCollectQueryData( hQuery );// ここから次同関数までの平均パフォーマンスが対象 Sleep( 100 ); PdhCollectQueryData( hQuery );// ここから前同関数までの平均パフォーマンスが対象 PdhGetFormattedCounterValue( hCounter, PDH_FMT_LONG | PDH_FMT_1000 , NULL, &fntValue ); _tcout << "loV:" << fntValue.longValue << std::endl; PdhCloseQuery( hQuery ); } return 0; }

    Windows XP Professional(SP3)32bit

    Windows 7 Professional(SP1)64bit

    両方同環境です。

    CPU:Intel(R) Core(TM) i7-2860QM CPU

    メモリ:8.00GB

    2013年7月31日 23:03

すべての返信

  • 7で時間がかかる場合もコンソールアプリケーションで作成した場合、又はWin32プロジェクトで作り、実行時にcmd等から [ it.exe | more ]のようにリダイレクトした場合で標準出力先がない場合は時間がかからないみたいです。

    でしたらPdhAddCounter()の問題なのでしょうか?  UNICODEではなくMBCSで実行したらどうなりますか?

    というのも、 _tcout << __LINE__ << ":PdhOpenQuery" << std::endl という行は出力先は char / wchar_t の切り替えが行われているのに出力内容は char でハードコーディングされています。これは std::wout の際に char → wchar_t の文字コード変換を要します。

    2013年7月31日 23:21
  • 文字コード変換にコストがかかっているとしたらそれはそれで問題ですが、

    確認してみましたが関係ないみたいです。

    またひとつ目の_tcout << __LINE__ << ":PdhOpenQuery" << std::endl; はすぐに表示されます。

    標準出力を使っているととあるAPIが遅くなるという症状は前々からあったのでPdhAddCounter()固有の問題ではないと思います。

    2013年8月2日 4:04