.net 中性能计数器的初始化非常慢

Posted

技术标签:

【中文标题】.net 中性能计数器的初始化非常慢【英文标题】:Initialization of Performance Counters in .net are very slow 【发布时间】:2021-10-06 22:14:21 【问题描述】:

我目前有两个 PerformanceCounters 在我的 Windows 窗体应用程序启动时产生问题。

PerformanceCounters 是在应用程序启动时启动的UserControl 的设计器类中创建的。创建称为performanceCounterMemoryperformanceCounterProTime 的计数器能够为用户提供当前使用的RAM 内存和处理时间(百分比)的实时反馈。它们是在设计器类中使用以下行创建的

    this.performanceCounterMemory = new System.Diagnostics.PerformanceCounter();
    this.performanceCounterProTime = new System.Diagnostics.PerformanceCounter();

    ((System.ComponentModel.ISupportInitialize)(this.performanceCounterMemory)).BeginInit();
    ((System.ComponentModel.ISupportInitialize)(this.performanceCounterProTime)).BeginInit();

    this.performanceCounterMemory.CategoryName = "Memory";
    this.performanceCounterMemory.CounterName = "% used dedicated byte";
        
    this.performanceCounterProTime.CategoryName = "Processor";
    this.performanceCounterProTime.CounterName = "% Processor Time";
    this.performanceCounterProTime.InstanceName = "_Total";

    ((System.ComponentModel.ISupportInitialize)(this.performanceCounterMemory)).EndInit();
    ((System.ComponentModel.ISupportInitialize)(this.performanceCounterProTime)).EndInit();

由于未知原因,对最后两行的调用,EndInit() 调用,因为两个计数器都非常慢(10 多秒),导致应用程序启动非常慢。

这是为什么? EndInit 调用的目的是什么?是否可以让它更快?

为了能够使用计数器,以下两个引用由行添加

using System.Management.Instrumentation;
using System.Management;

机器处理器是:Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz

【问题讨论】:

我相信 EndInit 基本上就像Wait 一样,等待初始化完成。它很慢。您可以将其移至另一个线程或等待调用 EndInit 直到您准备好读取计数器 我明白了,感谢您指出这一点。知道为什么与 DataGridView 等其他控件相比,性能计数器的初始化时间要长得多吗? 我真的没有,但我注意到了。我知道它们必须运行一段时间才能获得有意义的数据(随时间对 CPU 使用情况进行采样)。 确实,但是我希望应用程序能够检测到某个时间段内任一计数器的值是否/何时超过某个值。 不要使用 PerformanceCounter 组件,运行 PerformanceCounter 类对象并从 ThreadPool 线程返回它们的值。阅读有关多线程的说明。 【参考方案1】:
long memory = GC.GetTotalMemory(true);

可以使用如下函数(true参数告诉GC先构建) 这个是给内存用的,我不是很懂,也许会有所帮助)

【讨论】:

以上是关于.net 中性能计数器的初始化非常慢的主要内容,如果未能解决你的问题,请参考以下文章

winserver-性能监视器计数器介绍

实体框架 DbContext 过滤的计数查询使用变量非常慢

React Native Expo App 性能非常慢

Django Rest Framework 分页极慢计数

熊猫计数正/负/中性值

MongoDB 计数非常慢