【发布时间】:2017-04-21 18:01:05
【问题描述】:
我正在尝试实现一个性能监控工具,我想监控基本的东西,例如内存和 CPU。
我试图通过使用性能计数器来做到这一点,因为我相信这是在 C# 中查询进程性能的“正确”方式,这是一些示例代码:
class Program
{
static void Main(string[] args)
{
while (true)
{
var pcs = Process.GetProcesses()
.Select(p => new PerformanceCounter("Process", "Working Set - Private", p.ProcessName));
var sw = Stopwatch.StartNew();
foreach (var pc in pcs)
pc.NextValue();
Console.WriteLine($"Time taken to read {pcs.Count()} performance counters: {sw.ElapsedMilliseconds}ms");
Thread.Sleep(1000);
}
}
}
很明显,在我的系统上查询一个进程大约需要 12.5 毫秒,速度慢得让人无法接受。应该怎么做?
我已经在这篇文章中提出了一个相关问题:Performance Counter read access very slow - How does Task Manager do it?
但我意识到我在那篇文章中不够具体,并问了错误的问题。我真正想知道的是如何使用性能计数器做我想做的事情,还是根本不可能?
EDIT1:
我正在运行 Windows 10 专业版 1607 - 内部版本 14393.479
【问题讨论】:
-
您可以随时use the raw Win32 API.. 或并行运行一些任务。
-
顺便说一句,Memory Performance MSDN page 说 “内存性能信息可通过系统性能计数器和 GetPerformanceInfo、GetProcessMemoryInfo 和 GlobalMemoryStatusEx 等函数从内存管理器获得。应用程序如 Windows任务管理器、可靠性和性能监视器以及 Process Explorer 工具使用性能计数器来显示系统和各个进程的内存信息。”
-
@stuartd 你知道吗,我完全忘记了线程。我确实可以并行运行它们!我想知道这会对性能产生什么影响..
-
@stuartd 并行执行它仍然太慢:(
标签: c# windows performance performancecounter query-performance