.net 如果类别不存在,则PerformanceCounterCategory.Exists的速度非常慢;不存在

.net 如果类别不存在,则PerformanceCounterCategory.Exists的速度非常慢;不存在,.net,system.diagnostics,.net,System.diagnostics,我有一种库,它使用一堆自己的性能计数器。但我希望我的库可以正常工作,即使没有安装性能计数器 因此,我围绕PerformanceCounter创建了包装器,并在第一次使用时检查PerfCounter是否存在。如果它们存在,那么我将使用本机PerformanceCounter,而不是使用不起任何作用的包装器 因此,为了检查性能计数器是否存在,我使用PerformanceCounterCategory.Exists 问题是,如果没有此类类别,则PerformanceCounterCategory.Ex

我有一种库,它使用一堆自己的性能计数器。但我希望我的库可以正常工作,即使没有安装性能计数器

因此,我围绕PerformanceCounter创建了包装器,并在第一次使用时检查PerfCounter是否存在。如果它们存在,那么我将使用本机PerformanceCounter,而不是使用不起任何作用的包装器

因此,为了检查性能计数器是否存在,我使用PerformanceCounterCategory.Exists

问题是,如果没有此类类别,则PerformanceCounterCategory.Exists调用(在我的机器上)大约需要10秒! 不用说它太慢了

我能做什么

您自己尝试的代码: 使用制度; 使用系统诊断

class Program
{
    static void Main(string[] args)
    {
        var ts = Stopwatch.StartNew();
        var res = PerformanceCounterCategory.Exists("XYZ");
        Console.WriteLine(ts.ElapsedMilliseconds);
        Console.WriteLine("result:" + res);
}
}

这似乎是无法避免的。从MSDN:

使用Exists方法可能会导致 在一个明显的表现惩罚 而 检查机器是否可用。 如果您只向 性能计数器,您可以避免 性能计数器的全局搜索 通过创建性能计数器 当应用程序安装并 假设类别存在时 访问计数器。没有办法 避免使用性能计数器 从性能中读取时进行搜索 柜台


重点是我的。

这是一个8年前的问题,但我只想分享我的解决方法:

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