40

長時間実行されるバックグラウンドプログラムに取り組んでおり、デバッグ時にリアルタイムで監視するために、定期的にいくつかの値をフィードする外部ロギングプログラム( SmartInspect )があります。

TaskManagerやIARSNTaskInfoなどの複数のプログラムを簡単に起動できることはわかっていますが、プログラムがX%CPU、ログでこれにフラグを立てます。

メモリ消費量、ワーキングセットなど、いくつかの統計をSmartInspectに定期的にフィードするバックグラウンドスレッドがあります。

このスレッドが、コンピューターのCPUリソースをどれだけ消費しているかをかなり正確に測定することは可能ですか?メインプログラムはシングルスレッドアプリケーション(統計をログに記録するウォッチドッグスレッドを除く)であるため、テクニックがシングルスレッドの使用量に制限されている場合は、それも適しています。

LinuxとCのrusageと呼ばれるものに関連するエントリをいくつか見つけました。これに使用できる同様のエントリはありますか?


編集:わかりました。パフォーマンスカウンターの方法を試しましたが、呼び出されるたびにかなりの量のGCデータが追加されたため、メモリ使用量とガベージコレクションのグラフが急上昇しました。とりあえずこの部分は省きます。

4

5 に答える 5

50

System.Diagnosticsを使用することもできます。Process.TotalProcessorTimeおよびSystem.Diagnostics。この記事で説明されているように、プロセッサの使用量を計算するためのProcessThread.TotalProcessorTimeプロパティ。

于 2008-11-09T14:47:49.477 に答える
9

をご覧くださいSystem.Diagnostics.PerformanceCounter。実行するperfmon.exeと、使用可能なパフォーマンスカウンターの範囲が表示されます(「パフォーマンスオブジェクト」を「プロセス」に設定します)。そのうちの1つは「%プロセッサー時間」です。

于 2008-11-09T14:27:07.710 に答える
4

System.Diagnostic.PerformanceCounterクラスを介して実行できます。CPU使用率を監視している人の例を次に示します。

http://blogs.msdn.com/dotnetinterop/archive/2007/02/02/system-diagnostics-performancecounter-and-processor-time-on-multi-core-or-multi-cpu.aspx

これには昇格された特権が必要であることに注意してください。そして、それを使用するとパフォーマンスが低下する可能性があります。

于 2008-11-09T14:27:11.860 に答える
3

smartinspectのようなモニターにログを記録するのは良いことです。ただし、Windows自体は、この場合はプログラム(またはプロセス)の各リソースのデータを収集します。WMIは、アプリケーション監視の標準です。WMIによってキャプチャされたデータを表示できます。多くのアプリケーション管理、ヘルスモニタリング、またはアプリケーションモニタリングツールは、すぐに使用できるWMIをサポートしています。

したがって、アプリケーション内のCPU使用率をログファイルに記録することはお勧めしません。

可用性とパフォーマンスが重要であると思われる場合は、MicrosoftOperationsManagerソリューションなどのソリューションを選択してください。

WMIについてのアイデアを取得し、プロセスのリストを取得するには、以下を参照してください。- CPUWin32_PerfFormattedData_PerfProc_Process時間を取得するには、フィルターはprocessID です。この記事を参照してください -Win32_processクラスからprocessIDを取得できます。

WMIはKevinMatthewGossによってC#で簡単になりました

oConn.Username = "JohnDoe";
oConn.Password = "JohnsPass";

System.Management.ManagementScope oMs = new System.Management.ManagementScope("\\MachineX", oConn);    

//get Fixed disk stats
System.Management.ObjectQuery oQuery = new System.Management.ObjectQuery("select FreeSpace,Size,Name from Win32_LogicalDisk where DriveType=3");

//Execute the query 
ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs,oQuery);

//Get the results
ManagementObjectCollection oReturnCollection = oSearcher.Get();   

//loop through found drives and write out info
foreach( ManagementObject oReturn in oReturnCollection )
{
    // Disk name
    Console.WriteLine("Name : " + oReturn["Name"].ToString());
    // Free Space in bytes
    Console.WriteLine("FreeSpace: " + oReturn["FreeSpace"].ToString());
    // Size in bytes
    Console.WriteLine("Size: " + oReturn["Size"].ToString());
} 

リモートシステムからもプロセスを監視できます。

于 2008-11-09T17:40:06.697 に答える
-2

このコード プロジェクト記事では、ハイ パフォーマンス タイマーの使用方法について説明します。

http://www.codeproject.com/KB/cs/highperformancetimercshar.aspx

これを使用して、コードの実行時間を計ることができます。

ここでは、多数のオープン ソース C# プロファイラーを見つけることができます。

http://csharp-source.net/open-source/profile

于 2010-05-11T10:56:40.940 に答える