我正在研究一个电荷平衡系统,因此我需要知道每台机器的充电量。PerformanceCounter似乎是一条路,但创建第一台需要38到60秒。然而,随后的每一个新计数器或“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);
}
}Research
PerformanceCounter extremely slow in connecting remote server
Creating a new System.Diagnostics.PerformanceCounter is very slow
我试着使用其他构造函数并给出一个精确的“MachineName”,但是它并没有改变任何事情。
Why a call to PerformanceCounter is slow?
21.html
根据这两个线程,问题似乎与性能计数器是共享资源这一事实有关。但是我不明白我怎么能解决这个问题。
在管理员中运行Visual将第一个创建从38秒加速到26秒,因此它也解决不了这个问题。
谢谢你的帮助。
发布于 2015-03-22 18:40:27
我在我的机器上尝试了您的代码,PerformanceCounter的构造函数得到了>2.5秒的时间。我无法调试.NET源代码(我正在运行VS2013速成版,Windows764b),但我做了一系列经验:
因此,我认为没有设置问题,答案是PerformanceCounter构造函数做复杂的工作,需要很长时间才能执行。
正在监视的所有事件都是软件事件,操作系统可以跟踪这些事件。因此,我假设在创建新的PerformanceCounter对象时,操作系统必须生成机器的当前状态。这可能意味着获取所有进程的信息,最重要的是,将这些信息存储到可读和快速访问的结构中。我观察到的是,我拥有的活动进程越多,创建PerformanceCounter的速度就越慢。而且,你拥有的核心越多,你可能需要收集更多的数据。
在您发送的最后一个链接中,有一条评论似乎验证了这一理论,但我认为自2005年以来,spinlock部分进行了优化。最后的方法可能是调试用于构造.NET的PerformanceCounter源代码。然而,我认为这正是它的实现方式。
我要做的是在应用程序的初始化阶段创建我需要的PerformanceCounter对象。
发布于 2018-06-25 12:29:14
这就是帮我解决问题的地方:
我的应用程序中的性能计数器设置时间从2:30分钟下降到了大约20秒,因为它是作为64位进程执行的。有趣的是,我只在Windows2012VM中出现了性能问题。Windows 10没有问题。
https://stackoverflow.com/questions/22297649
复制相似问题