首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建PerformanceCounter需要很长时间

创建PerformanceCounter需要很长时间
EN

Stack Overflow用户
提问于 2014-03-10 10:27:40
回答 2查看 3.9K关注 0票数 7

我正在研究一个电荷平衡系统,因此我需要知道每台机器的充电量。PerformanceCounter似乎是一条路,但创建第一台需要38到60秒。然而,随后的每一个新计数器或“NextValue”调用几乎都是即时的。

下面是我使用的代码:

代码语言:javascript
复制
[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秒,因此它也解决不了这个问题。

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2015-03-22 18:40:27

我在我的机器上尝试了您的代码,PerformanceCounter的构造函数得到了>2.5秒的时间。我无法调试.NET源代码(我正在运行VS2013速成版,Windows764b),但我做了一系列经验:

  1. 我调用了默认构造函数的PerformanceCounter。它立即执行。
  2. 使用perfmon,我检查了与网络相关的活动。我没看到什么奇怪的东西。
  3. 我监视了内存占用。我看到,在调用第一个参数化构造函数时,我将~2.5MB添加到代码的内存占用空间中。
  4. 使用perfmon,我检查使用的互斥量、信号量和其他同步对象的计数是否有尖峰。没有什么不寻常的事情发生。
  5. 当不同数量的进程处于活动状态时,我对代码进行了多次测试。我看到有很大的变化,。有时我得到1.4秒,有时我得到2.7,有时我得到5秒。
  6. 我已经打开了一个GUI监视会话并运行了代码,但是我没有看到任何收获。

因此,我认为没有设置问题,答案是PerformanceCounter构造函数做复杂的工作,需要很长时间才能执行。

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

在您发送的最后一个链接中,有一条评论似乎验证了这一理论,但我认为自2005年以来,spinlock部分进行了优化。最后的方法可能是调试用于构造.NET的PerformanceCounter源代码。然而,我认为这正是它的实现方式。

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

票数 3
EN

Stack Overflow用户

发布于 2018-06-25 12:29:14

这就是帮我解决问题的地方:

我的应用程序中的性能计数器设置时间从2:30分钟下降到了大约20秒,因为它是作为64位进程执行的。有趣的是,我只在Windows2012VM中出现了性能问题。Windows 10没有问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22297649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档