我有一种库,它使用一堆自己的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);
}
}
答案 0 :(得分:6)
这似乎是无法避免的。来自MSDN:
可能会导致使用Exists方法 在一个明显的性能惩罚 而所有的性能指标都在 检查机器的可用性。 如果你只是写一个 性能计数器,你可以避免 全局搜索性能计数器 通过创建性能计数器 安装应用程序时 假设类别存在时 访问柜台。没有办法 避免性能计数器 从性能阅读时搜索 计数器。
重点是我的。
答案 1 :(得分:0)
这是一个已有8年历史的问题,但请分享为我解决的问题:
通过确保应用程序是作为64位进程执行的,我的应用程序中的性能计数器设置时间从2:30分钟减少到20秒左右。 有趣的是,我仅在Windows 2012 VM中遇到性能问题。在Windows 10中没有问题。