当我创建和使用这样的性能计数器时:
private readonly PerformanceCounter _cpuPerformanceCounter;
public ProcessViewModel(Process process)
{
_cpuPerformanceCounter = new PerformanceCounter("Process", "% Processor Time", process.ProcessName, true);
}
public void Update()
{
CPU = (int)_cpuPerformanceCounter.NextValue() / Environment.ProcessorCount; // Exception
}
Run Code Online (Sandbox Code Playgroud)
...我得到一个异常实例"实例的名称"在指定的类别中不存在,并且不理解原因.
PS代码
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.net>
<settings>
<performanceCounters enabled="true"/>
</settings>
</system.net>
</configuration>
Run Code Online (Sandbox Code Playgroud)
...包含在App.config中.
在静态Stopwatch构造函数中,我们可以看到以下代码,它基本上检查是否存在高分辨率性能计数器.
static Stopwatch()
{
if (!SafeNativeMethods.QueryPerformanceFrequency(out Frequency))
{
IsHighResolution = false;
Frequency = 0x989680L;
tickFrequency = 1.0;
}
else
{
IsHighResolution = true;
tickFrequency = 10000000.0;
tickFrequency /= (double) Frequency;
}
}
Run Code Online (Sandbox Code Playgroud)
在MSDN上,它说QueryPerformanceFrequency:
检索高分辨率性能计数器的频率(如果存在)
然而,目前还不清楚它究竟存在的时候?我怀疑它通常存在于当前的机器上,但究竟不是吗?
这很有意思,因为当它不存在时,Stopwatch变成仅仅DateTime.UtcNow属性的包装.
可能重复:
C# - 如何获得计算机的RAM总量?
以下将检索可用的ram数量:
PerformanceCounter ramCounter;
ramCounter = new PerformanceCounter("Memory", "Available MBytes");
Console.WriteLine("Total RAM: " + ramCounter.NextValue().ToString() + " MB\n\n");
Run Code Online (Sandbox Code Playgroud)
当然我们必须使用System.Diagnostics; 类.
performancecounter是否具有检索特定计算机的RAM量的任何功能?我不是在谈论使用或未使用的ram数量.我说的是机器的内存量.
我正在尝试为在2个不同服务器上运行的程序构建负载均衡器.
到目前为止,我的负载均衡器只使用每个服务器程序中的PerformanceCounter实例来检查每个服务器的CPU使用情况.
我还想检查每个服务器的带宽使用情况,我该如何检查?
(它可能也是使用PerformanceCounter完成的,但我不熟悉它的用法)
我想估计由于运行Linux的x86-64(Intel Nehalem)机器上的TLB未命中而导致的性能开销.我希望通过使用一些性能计数器得到这个估计.有没有人对什么是估计这个的最佳方法有一些指示?
谢谢Arka
我正在寻找python中的性能指标库.
我熟悉Coda Hale的指标,它是为JVM编写的,所以我想知道是否有一个等效的python(并且没有使用JVM).
简而言之,该工具的要求列表将是:
到目前为止,我发现PyCounters可以完成一些工作,但不是全部工作.它有点满足我的第一个子弹(但它没有所有的度量类型,只有三个),这就是全部.
是否有更好的替代PyCounters?
谢谢
我很难确定增加性能计数器所需的权限.当我试图在计数器上调用.Increment时,我只有一次出现InvalidOperationException/Access Denied(我认为).这引出了以下信息:
http://support.microsoft.com/kb/555129
将性能计数器更新到生产环境的ASP.NET应用程序移动过程中遇到的最大问题是权限.默认情况下,为了增加性能计数器,用户需要具有管理员或高级用户权限.
从那里我将用户添加到高级用户组并继续前进,没有问题.这是一个不相关的问题,我后来发现"超级用户"不再拥有Vista以外的任何权限,让我回到同一篇文章:
幸运的是,考虑到这些替代方案,事实证明更新性能计数器所需的权限集比作为管理员或高级用户运行要小得多.在注册表项HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib中,设置访问控制列表,以便必要的用户具有完全控制权.在我们的原始示例中,ASPNET用户将被授予完全控制权,但是可以向需要更新性能计数器的任何人授予访问权限.
但即使这样也不是真的,因为我现在已经退回并从高级用户组中删除了我的测试用户,而我的应用程序仍然没有问题地递增计数器.
此外,似乎如果有权限设置,它将在HKLM\System\CurrentControlSet\services \下的单个计数器上.
我完全承认我的代码可能存在其他问题导致我的原始权限问题.但是,我需要将这一部分一直部署回XP,因此确认上述内容是否只是日期信息或完全不正确对我来说非常重要.我很快就会自己确认这一点,但如果有人能够验证信息或指向我具体的文档,那将会很好.
我正在尝试设置一个PerformanceCounter来衡量某种方法的平均执行时间.我试过阅读AverageTimer32,我看了很多例子,但我似乎无法做到正确.
我设置了类别
CounterCreationDataCollection CCDC = new CounterCreationDataCollection();
// Add the counter.
CounterCreationData averageTimer32 = new CounterCreationData();
averageTimer32.CounterType = PerformanceCounterType.AverageTimer32;
averageTimer32.CounterName = counterName;
CCDC.Add(averageTimer32);
// Add the base counter.
CounterCreationData averageTimer32Base = new CounterCreationData();
averageTimer32Base.CounterType = PerformanceCounterType.AverageBase;
averageTimer32Base.CounterName = baseCounterName;
CCDC.Add(averageTimer32Base);
// Create the category.
PerformanceCounterCategory.Create(categoryName, "Demonstrates usage of the AverageTimer32 performance counter type", PerformanceCounterCategoryType.SingleInstance, CCDC);
Run Code Online (Sandbox Code Playgroud)
然后我创建了计数器
PC = new PerformanceCounter(categoryName, counterName, false);
BPC = new PerformanceCounter(categoryName, baseCounterName, false);
PC.RawValue = 0;
BPC.RawValue = 0;
Run Code Online (Sandbox Code Playgroud)
最后,我每次调用方法时记录经过的时间
private …Run Code Online (Sandbox Code Playgroud) 我想计算在ARM cortex-M4(或cortex-M3)处理器上执行的每个循环的指令数.
它需要的是:我想要分析的代码的指令数量(在运行时执行)和代码执行的周期数.
1 - 周期数
使用循环计数器非常简单直接.
volatile unsigned int *DWT_CYCCNT ;
volatile unsigned int *DWT_CONTROL ;
volatile unsigned int *SCB_DEMCR ;
void reset_timer(){
DWT_CYCCNT = (int *)0xE0001004; //address of the register
DWT_CONTROL = (int *)0xE0001000; //address of the register
SCB_DEMCR = (int *)0xE000EDFC; //address of the register
*SCB_DEMCR = *SCB_DEMCR | 0x01000000;
*DWT_CYCCNT = 0; // reset the counter
*DWT_CONTROL = 0;
}
void start_timer(){
*DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter …Run Code Online (Sandbox Code Playgroud) 我想在XeonE5 Sandy Bridge上使用基于精确事件的采样(PEBS)来记录特定事件的所有地址(例如缓存未命中).
但是,Core TM i7处理器和Intel®XeonTM5500处理器性能分析指南(第24页)包含以下警告:
由于PEBS机制在指令完成时捕获寄存器的值,因此无法重建以下类型的加载指令(Intel asm约定)的解除引用的地址.
MOV RAX, [RAX+const]
这种指令主要与指针追逐相关联.
mystruc = mystruc->next;
这是捕获存储器指令地址的这种方法的重大缺点.
根据objdump,我在程序中有许多该表单的加载指令.有什么办法可以避免吗?
由于这是一个特定于英特尔的问题,解决方案不必以任何方式移植,它只需要工作.我的代码是用C语言编写的,我理想地寻找编译器级解决方案(gcc或icc),但欢迎任何建议.
一些例子:
mov 0x18(%rdi),%rdi
mov (%rcx,%rax,8),%rax
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,该指令退役之后(因此当我看到的寄存器值来找出我装到/从)的地址(分别的值%rdi + 18和%rcx + 8 * %rax这些实施例中)通过的结果重写mov.