PerformanceCounter创建需要很长时间

时间:2014-03-10 10:27:41

标签: c# performance load-balancing performancecounter shared-resource

我正在研究电荷平衡系统,因此我需要了解每台机器的费用。 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秒,所以它也没有解决问题。


感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

我在我的机器上尝试了你的代码,并且我为PerformanceCounter的构造函数获得了2.5秒。我无法调试.NET源代码(我正在运行VS2013 Express Edition,Windows 7 64b ),但我做了一系列的经验:

  1. 我调用了PerformanceCounter的默认构造函数。它会立即执行。
  2. 使用perfmon我检查了网络相关活动。我没有看到任何奇怪的东西。
  3. 我监控内存占用。我看到在调用第一个参数化构造函数时,我在代码的内存占用量上添加了~2.5MB。
  4. 使用perfmon我检查了使用的互斥锁,信号量和其他同步对象的数量是否有峰值。没有什么不寻常的事情发生。
  5. 我在不同数量的进程处于活动状态时,在不同时间测试了代码。我看到很大的变化。有时候我得到1.4秒,有时候我得到2.7,有时候得到5秒。
  6. 我已经打开了一个GUI监控会话并运行了代码,但我看不到任何收获。
  7. 所以我相信没有设置问题,答案是 PerformanceCounter构造函数执行复杂的工作需要花费大量时间来执行

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

    在您发送的最后一个链接中,有一条评论似乎验证了这一理论,但我认为自2005年以来螺旋锁部分已经过优化。可能最后的措施是调试.NET源来构建PerformanceCounter 。但是我认为这就是它的实施方式。

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

答案 1 :(得分:0)

这是为我解决的问题:

通过确保应用程序是作为64位进程执行的,我的应用程序中的性能计数器设置时间从2:30分钟减少到20秒左右。有趣的是,我仅在Windows 2012 VM中遇到性能问题。在Windows 10中没有问题。

相关问题