我正在做一个电荷平衡系统,因此我需要知道每台机器的电荷。PerformanceCounter似乎是可行的方法,但创建第一个需要38到60秒。然而,每个后续的新Counter或'NextValue'调用几乎是即时的。
下面是我使用的代码:[TestClass]
public class PerfMon
{
[TestMethod]
public void SimpleCreationTest()
{
Stopwatch Time = new Stopwatch();
Time.Start();
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds);
// Create
PerformanceCounter RAM = new PerformanceCounter("Memory", "Available MBytes");
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds + " => RAM created");
PerformanceCounter CPU = new PerformanceCounter("Processor", "% Processor Time", "_Total");
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds + " => CPU created");
PerformanceCounter GC = new PerformanceCounter(".NET CLR Memory", "% Time in GC", "_Global_");
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds + " => GC created");
// Read
float Value = RAM.NextValue();
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds + " => RAM value is : " + Value);
Value = CPU.NextValue();
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds + " => CPU value is : " + Value);
Value = GC.NextValue();
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds + " => GC value is : " + Value);
}
}
研究PerformanceCounter连接远程服务器非常慢
创建一个新的System.Diagnostics.PerformanceCounter非常慢
我尝试使用其他构造函数并给出一个精确的'MachineName',但它没有改变任何东西。
为什么调用PerformanceCounter很慢?
http://craigandera.blogspot.fr/2005/06/performancecounter-constructor-horribly_21.html根据这两个线程,问题似乎是关于性能计数器是共享资源的事实。然而,我不明白如何解决这个问题。
在管理员中运行Visual Studio将第一次创建从38秒"加速"到26秒,所以它也不能解决问题。
谢谢你的帮助。
我在我的机器上尝试了你的代码,我得到了>2.5秒的构造函数的PerformanceCounter。我无法调试。net源代码(我正在运行VS2013 Express Edition, Windows 7 64b),但我做了一系列的实验:
- 我调用了PerformanceCounter的默认构造函数。它立即执行。我使用perfmon检查了网络相关的活动。我没看到什么特别的。我监控了内存占用。我发现,当调用第一个参数化构造函数时,我给代码的内存占用增加了2.5MB。
- 使用perfmon,我检查是否有使用互斥量,信号量和其他同步对象的计数峰值。
- 我在不同的时间测试了代码,而不同数量的进程是活跃的。我看到有很大的变化。有时我得到1.4秒,有时我得到2.7秒有时我得到5秒
- 我已经打开了GUI监控会话并运行了代码,但我没有看到任何收益。
所以我相信没有设置问题,答案是PerformanceCounter构造函数做复杂的工作,需要很多时间来执行。
所有被监视的事件都是软件事件,可以被操作系统跟踪。所以我假设当一个新的PerformanceCounter对象被创建时,操作系统必须生成机器的当前状态。这可能意味着获取所有进程的信息,最重要的是,将这些信息存储到可读且可快速访问的结构中。我观察到的是,我拥有的活动进程越多,创建PerformanceCounter就越慢。此外,您拥有的内核越多,可能需要收集的数据就越多。
在你发送的最后一个链接中,有一个评论似乎验证了这个理论,但我想自2005年以来自旋锁部分得到了优化。最后的办法可能是调试。net源代码以构造PerformanceCounter。然而,我认为这就是它的实现方式。
我要做的是创建我在应用程序初始化阶段需要的PerformanceCounter对象。
这是为我修复的:
我的应用程序中的性能计数器设置时间从2:30分钟减少到大约20秒,确保它作为64位进程执行。有趣的是,我只在Windows 2012虚拟机中遇到了性能问题。Windows 10没有问题