.net 如果类别不存在,则PerformanceCounterCategory.Exists的速度非常慢;不存在
我有一种库,它使用一堆自己的性能计数器。但我希望我的库可以正常工作,即使没有安装性能计数器 因此,我围绕PerformanceCounter创建了包装器,并在第一次使用时检查PerfCounter是否存在。如果它们存在,那么我将使用本机PerformanceCounter,而不是使用不起任何作用的包装器 因此,为了检查性能计数器是否存在,我使用PerformanceCounterCategory.Exists 问题是,如果没有此类类别,则PerformanceCounterCategory.Exists调用(在我的机器上)大约需要10秒! 不用说它太慢了 我能做什么 您自己尝试的代码: 使用制度; 使用系统诊断.net 如果类别不存在,则PerformanceCounterCategory.Exists的速度非常慢;不存在,.net,system.diagnostics,.net,System.diagnostics,我有一种库,它使用一堆自己的性能计数器。但我希望我的库可以正常工作,即使没有安装性能计数器 因此,我围绕PerformanceCounter创建了包装器,并在第一次使用时检查PerfCounter是否存在。如果它们存在,那么我将使用本机PerformanceCounter,而不是使用不起任何作用的包装器 因此,为了检查性能计数器是否存在,我使用PerformanceCounterCategory.Exists 问题是,如果没有此类类别,则PerformanceCounterCategory.Ex
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中没有问题