【发布时间】:2014-04-13 09:46:58
【问题描述】:
我正在研究电荷平衡系统,因此我需要知道每台机器的电荷。 PerformanceCounter 似乎是要走的路,但创建第一个需要 38 到 60 秒。然而,每个后续的新 Counter 或“NextValue”调用几乎都是即时的。
这是我正在使用的代码:
[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);
}
}
研究
PerformanceCounter extremely slow in connecting remote server
Creating a new System.Diagnostics.PerformanceCounter is very slow
我尝试使用其他构造函数并给出精确的“机器名称”,但它并没有改变任何东西。
Why a call to PerformanceCounter is slow?
http://craigandera.blogspot.fr/2005/06/performancecounter-constructor-horribly_21.html
根据这两个线程,问题似乎在于性能计数器是共享资源这一事实。但是我不明白我该如何解决。
在管理员中运行 Visual Studio 将第一次创建从 38 秒“加速”到 26 秒,因此它也不能解决问题。
感谢您的帮助。
【问题讨论】:
-
尝试通过公共静态变量实现 PerformanceCounter 实例,如下所示msdn.microsoft.com/en-us/library/…
-
这就是我的“真实”课堂的工作方式——以及我发现问题的方式。在上面的测试代码中将 PerformanceCounter 设置为“静态公共”并没有改变任何内容。
-
这似乎是网络问题加上身份验证问题。 NextValue() 方法文档确实提到了这一点 - 要读取性能计数器,您必须具有管理权限。在 Windows Vista 中,用户帐户控制 (UAC) 确定用户的权限。如果您是 Built-in Administrators 组的成员,则会为您分配两个运行时访问令牌:一个标准用户访问令牌和一个管理员访问令牌。默认情况下,您是标准用户角色。
-
所以...作为管理员“解决”身份验证问题而不是网络问题?我不明白为什么在我请求本地性能时网络会在这里发挥任何作用。使用“无机器名称”构造函数,构造函数甚至不必查看本地机器外部。无论如何,使用这个:sevenforums.com/tutorials/… 我已经能够在不以管理员身份启动 VS 的情况下将 PerformanceCounter 创建时间缩短到 26 秒。但是“网络问题”仍然没有意义。这很奇怪。
-
哦,我不知道它在本地运行。所以是的,
network issue绝对没有意义。
标签: c# performance load-balancing performancecounter shared-resource