如果类别不存在,PerformanceCounterCategory.Exists非常慢

时间:2010-04-16 17:45:03

标签: .net system.diagnostics

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

所以我已经在PerformanceCounter上创建了包装器,并在第一次使用时检查PerfCounter是否存在。如果它们存在,那么我正在使用本机PerformanceCounter而不是我使用的包装器什么都不做。

因此,为了检查perf计数器的存在,我使用了PerformanceCounterCategory.Exists

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

我该怎么办?

自己试用的代码:     使用系统;     使用System.Diagnostics;

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

2 个答案:

答案 0 :(得分:6)

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

  

可能会导致使用Exists方法   在一个明显的性能惩罚   而所有的性能指标都在   检查机器的可用性。   如果你只是写一个   性能计数器,你可以避免   全局搜索性能计数器   通过创建性能计数器   安装应用程序时   假设类别存在时   访问柜台。没有办法   避免性能计数器   从性能阅读时搜索   计数器。

重点是我的。

答案 1 :(得分:0)

这是一个已有8年历史的问题,但请分享为我解决的问题:

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