创建PerformanceCounter需要很长时间



我正在做一个电荷平衡系统,因此我需要知道每台机器的电荷。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。
  1. 使用perfmon,我检查是否有使用互斥量,信号量和其他同步对象的计数峰值。
  2. 我在不同的时间测试了代码,而不同数量的进程是活跃的。我看到有很大的变化。有时我得到1.4秒,有时我得到2.7秒有时我得到5秒
  3. 我已经打开了GUI监控会话并运行了代码,但我没有看到任何收益。

所以我相信没有设置问题,答案是PerformanceCounter构造函数做复杂的工作,需要很多时间来执行

所有被监视的事件都是软件事件,可以被操作系统跟踪。所以我假设当一个新的PerformanceCounter对象被创建时,操作系统必须生成机器的当前状态。这可能意味着获取所有进程的信息,最重要的是,将这些信息存储到可读且可快速访问的结构中。我观察到的是,我拥有的活动进程越多,创建PerformanceCounter就越慢。此外,您拥有的内核越多,可能需要收集的数据就越多。

在你发送的最后一个链接中,有一个评论似乎验证了这个理论,但我想自2005年以来自旋锁部分得到了优化。最后的办法可能是调试。net源代码以构造PerformanceCounter。然而,我认为这就是它的实现方式。

我要做的是创建我在应用程序初始化阶段需要的PerformanceCounter对象。

这是为我修复的:

我的应用程序中的性能计数器设置时间从2:30分钟减少到大约20秒,确保它作为64位进程执行。有趣的是,我只在Windows 2012虚拟机中遇到了性能问题。Windows 10没有问题

相关内容

  • 没有找到相关文章

最新更新