C# PerformanceCounter创建需要很长时间
我正在研究电荷平衡系统,因此我需要知道每台机器的电荷。PerformanceCounter似乎是一种方法,但创建第一个需要38到60秒。然而,每个后续的新计数器或“NextValue”调用几乎都是即时的 以下是我正在使用的代码:C# PerformanceCounter创建需要很长时间,c#,performance,load-balancing,performancecounter,shared-resource,C#,Performance,Load Balancing,Performancecounter,Shared Resource,我正在研究电荷平衡系统,因此我需要知道每台机器的电荷。PerformanceCounter似乎是一种方法,但创建第一个需要38到60秒。然而,每个后续的新计数器或“NextValue”调用几乎都是即时的 以下是我正在使用的代码: [TestClass] public class PerfMon { [TestMethod] public void SimpleCreationTest() { Stopwatch Time = new Stopwatch()
[TestClass]
public class PerfMon
{
[TestMethod]
public void SimpleCreationTest()
{
Stopwatch Time = new Stopwatch();
Time.Start();
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds);
// Create
PerformanceCounter RAM = new PerformanceCounter("Memory", "Available MBytes");
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds + " => RAM created");
PerformanceCounter CPU = new PerformanceCounter("Processor", "% Processor Time", "_Total");
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds + " => CPU created");
PerformanceCounter GC = new PerformanceCounter(".NET CLR Memory", "% Time in GC", "_Global_");
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds + " => GC created");
// Read
float Value = RAM.NextValue();
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds + " => RAM value is : " + Value);
Value = CPU.NextValue();
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds + " => CPU value is : " + Value);
Value = GC.NextValue();
Debug.WriteLine("Time is : " + Time.ElapsedMilliseconds + " => GC value is : " + Value);
}
}
研究
我尝试使用其他构造函数并给出一个精确的“MachineName”,但它没有改变任何东西
根据这两个线程,问题似乎与性能计数器是共享资源这一事实有关。但是我不明白我怎么能解决这个问题
在Administrator中运行Visual Studio将第一次创建从38秒“加速”到26秒,因此也无法解决问题
谢谢你的帮助。我在我的机器上尝试了你的代码,我得到了>2.5秒的性能计数器的构造函数时间。我无法调试.NET源代码(我运行的是VS2013 Express Edition,Windows 7 64b),但我做了一系列实验:
我要做的是在应用程序的初始化阶段创建所需的PerformanceCounter对象。这就是我所做的:
我的应用程序中的性能计数器设置时间从2:30分钟减少到20秒左右,因为它确保以64位进程执行。有趣的是,我只在Windows2012虚拟机中遇到了性能问题。Windows 10中没有问题。尝试通过公共静态变量实现PerformanceCounter实例,如图所示,这已经是我的“真实”类的工作方式,也是我发现问题的方式。在上面的测试代码中将PerformanceCounter设置为“静态公共”并没有改变任何事情。这似乎是一个网络问题加上身份验证问题。NextValue()方法文档确实提到了这一点——要读取性能计数器,您必须具有管理权限。在Windows Vista中,用户帐户控制(UAC)决定用户的权限。如果您是内置Administrators组的成员,则会为您分配两个运行时访问令牌:标准用户访问令牌和管理员访问令牌。默认情况下,您处于标准用户角色。因此。。。作为管理员“解决”身份验证问题,而不是网络问题?我不明白为什么网络会在这里扮演任何角色,因为我要求本地性能。使用“No machine name”构造函数,构造函数甚至不必查看本地计算机之外的内容。无论如何,使用这个:我已经能够在不以管理员身份启动VS的情况下将PerformanceCounter创建时间缩短到26秒。但“网络问题”仍然毫无意义。这很奇怪。哦,我不知道它在本地运行。因此,是的,
网络问题显然毫无意义;创建PerformanceCounter时的成本。使用缓存可重复使用相同的性能计数器.NET实例。此外,缓存的性能计数器甚至不需要与原始进程相对应(这是关联的另一个问题,但是…),并且只有InstanceName相关。尝试访问不再存在的实例的计数器只会抛出一个InvalidOperationException
:“指定类别中不存在实例“..”