我正在使用电荷平衡系统,因此我需要了解每台机器的电荷。 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的默认构造函数称为。它立即执行。
  • 使用perfmon,我检查了联网相关的 Activity 。我什么都没看到。
  • 我监视了的内存占用量。我看到当调用第一个参数化的构造函数时,我在代码的内存占用量上增加了约2.5MB。
  • 使用perfmon,我检查了已使用的互斥量,信号量和其他同步对象的数量是否存在峰值。没什么异常的。
  • 我在不同数量的进程处于 Activity 状态时多次测试了该代码。我看到有很大的变化。有时我得到1.4秒,有时我得到2.7,有时我得到5秒。
  • 我已经打开了一个GUI监视 session 并运行了代码,但没有发现任何好处。

  • 因此,我相信没有设置问题,答案是PerformanceCounter构造函数执行复杂的工作,需要花费大量时间才能执行。

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

    在您发送的最后一个链接中,有一条评论似乎验证了此理论,但我认为自2005年以来对自旋锁部分进行了优化。也许最后的手段是调试.NET源代码以构建PerformanceCounter。但是我认为这就是它的实现方式。

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

    关于c# - PerformanceCounter的创建需要很长时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22297649/

    10-11 09:26