我正在研究电荷平衡系统,因此我需要了解每台机器的费用。 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 extremely slow in connecting remote server
Creating a new System.Diagnostics.PerformanceCounter is very slow
我尝试使用其他构造函数并提供精确的' MachineName'但它并没有改变任何东西。
Why a call to PerformanceCounter is slow?
http://craigandera.blogspot.fr/2005/06/performancecounter-constructor-horribly_21.html
根据这两个线程,问题似乎是性能计数器是共享资源的事实。但是,我不明白我是如何解决这个问题的。
在管理员中运行Visual Studio'加速'第一次创作从38秒到26秒,所以它也没有解决问题。
感谢您的帮助。
答案 0 :(得分:3)
我在我的机器上尝试了你的代码,并且我为PerformanceCounter的构造函数获得了2.5秒。我无法调试.NET源代码(我正在运行VS2013 Express Edition,Windows 7 64b ),但我做了一系列的经验:
所以我相信没有设置问题,答案是 PerformanceCounter构造函数执行复杂的工作需要花费大量时间来执行。
所有被监控的事件都是软件事件,可以由操作系统跟踪。所以我想当创建一个新的PerformanceCounter对象时,操作系统必须生成机器的当前状态。这可能意味着获取所有进程的信息,最重要的是,将这些信息存储到可读且可快速访问的结构中。我观察到的是我拥有的活动越多,PerformanceCounter的创建速度越慢。您拥有的内核越多,可能需要收集的数据就越多。
在您发送的最后一个链接中,有一条评论似乎验证了这一理论,但我认为自2005年以来螺旋锁部分已经过优化。可能最后的措施是调试.NET源来构建PerformanceCounter 。但是我认为这就是它的实施方式。
我要做的是在应用程序的初始化阶段创建我需要的PerformanceCounter对象。
答案 1 :(得分:0)
这是为我解决的问题:
通过确保应用程序是作为64位进程执行的,我的应用程序中的性能计数器设置时间从2:30分钟减少到20秒左右。有趣的是,我仅在Windows 2012 VM中遇到性能问题。在Windows 10中没有问题。