我正在使用电荷平衡系统,因此我需要了解每台机器的电荷。 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
根据这两个线程,问题似乎与性能计数器是共享资源这一事实有关。但是我不明白如何解决这个问题。
在Administrator中运行Visual Studio可以将第一次创建从38秒“加速”到26秒,因此也无法解决问题。
谢谢你的帮助。
最佳答案
我在计算机上尝试了您的代码,并且PerformanceCounter的构造函数得到了超过2.5秒的时间。我无法调试.NET源代码(我正在运行VS2013 Express Edition,Windows 7 64b),但是我做了一系列实验:
因此,我相信没有设置问题,答案是PerformanceCounter构造函数执行复杂的工作,需要花费大量时间才能执行。
所有受监视的事件都是软件事件,可以由操作系统跟踪。因此,我想当创建一个新的PerformanceCounter对象时,操作系统必须生成机器的当前状态。这可能意味着获取所有进程的信息,最重要的是,将信息存储到可读且可快速访问的结构中。我观察到的是,我拥有的 Activity 进程越多,PerformanceCounter的创建速度就越慢。另外,您拥有的核心越多,可能必须收集的数据就越多。
在您发送的最后一个链接中,有一条评论似乎验证了此理论,但我认为自2005年以来对自旋锁部分进行了优化。也许最后的手段是调试.NET源代码以构建PerformanceCounter。但是我认为这就是它的实现方式。
我要做的是创建应用程序初始化阶段所需的PerformanceCounter对象。
关于c# - PerformanceCounter的创建需要很长时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22297649/