我试图测量GC我的应用程序中两点之间花费了多少时间。像这样的东西:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
gcPerfCounter.NextValue();
// This is the part that I would like to measure
doStuff();
var timeSpentInGC = gcPerfCounter.NextValue();
Run Code Online (Sandbox Code Playgroud)
但是,我不确定这是使用该计数器的正确方法。在这篇文章:正确使用“% Time in GC”性能计数器中,答案说它应该像秒表一样使用,这就是我在操作之前调用 NextValue() 的原因。我不认为是这种情况,因为当我删除第一gcPerfCounter.NextValue()行时,它给了我相同的结果。
MSDN 文章介绍了“% Time in GC”性能计数器:
显示自上次垃圾收集周期以来执行垃圾收集所花费的时间百分比。 https://msdn.microsoft.com/en-us/library/w8f5kw2e(v=vs.110).aspx
这让我很困惑,因为我认为自从上次以来GC cycle我们在 . 中花费的时间为零GC。所以根据这个描述,这个值应该始终为零。
您能解释一下这个性能计数器在我的例子中的含义和正确使用吗?
.net c# garbage-collection performancecounter memory-profiling
我正在尝试访问 AMD HD7000 系列卡上的 GPU 寄存器。我在 GPU 上连接了传感器,可以测量功率输入和消耗。我想开发一个 Linux C++ 应用程序来访问 GPU 的性能计数器,以根据 GPU 事件/操作评估功耗。我熟悉 C 和 C++,但不熟悉操作系统,并且不确定从哪里开始执行此类任务。
我有一个 PDF。AMD 15h 系列型号 30h-3Fh 的 Bios 和内核开发人员指南位于此处: https://support.amd.com/TechDocs/49125_15h_Models_30h-3Fh_BKDG.pdf
在链接文档的第 106 页中,描述了性能计数器。计数器在开始计数之前必须通过控制寄存器进行设置。在第 715 页,更详细地定义了计数器。
本文档没有列出内存偏移量,所以我查了开源的AMD Linux 4.14.12驱动程序。在/drivers/gpu/drm/amd/amdgpu/sid.h第1256行下,我发现了一个性能计数器地址0x2688:
#define CB_PERFCOUNTER0_SELECT0 0x2688
Run Code Online (Sandbox Code Playgroud)
http://elixir.free-electrons.com/linux/v4.14.12/source/drivers/gpu/drm/amd/amdgpu/sid.h#L1256
另外,起始和停止计数器整数从第 1457 行开始:
#define PERFCOUNTER_START (23 << 0)
#define PERFCOUNTER_STOP (24 << 0)
Run Code Online (Sandbox Code Playgroud)
http://elixir.free-electrons.com/linux/v4.14.12/source/drivers/gpu/drm/amd/amdgpu/sid.h#L1457
我假设 CB_PERFCOUNTER 定义是相关地址,并且可以用作 GPU 寄存器内存位置的偏移量。我在互联网上搜索了很多,并且有很多资源,尽管我很难评估每个资源是否有任何相关信息或任何步骤如何适合整个流程。任何直接的解释或对材料的引用将不胜感激。
有多种方法可以测量 AngularJs 应用程序的性能(如何测量 AngularJS 应用程序的摘要周期的性能?)。Angular 应用程序怎么样?我们在 Angular 内部有用于此目的的东西吗?或者第三方库?
我正在尝试使用 RDMSR 和 WRMSR 指令读取 PMC(性能监控计数器)。
\n\n在我的具有 Intel i7 6700 CPU (Skylake) 的 Linux 桌面上,我编写了一个简单的驱动程序代码:
\n\nstatic int my_init(void)\n{\n unsigned int msr;\n u64 low, high;\n\n msr = 0x187;\n low = 0x412e;\n high = 0x0;\n\n asm volatile("1: wrmsr\\n"\n "2:\\n"\n : : "c" (msr), "a"(low), "d" (high) : "memory");\n\n msr = 0xC2;\n asm volatile("1: rdmsr\\n"\n "2:\\n"\n : "=a" (low), "=d" (high) : "c" (msr)); \n\n printk("val: %lu\\n", (low) | ((high) << 32));\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n参考Intel手册(18.2 ARCHITECTURAL PERFORMANCE MONITORING in Intel\xc2\xae …
我正在尝试确定 ARM Cortex A15 处理器上可用的哪些硬件计数器是用于确定系统范围 L2 缓存未命中的正确计数器。
我在这里的应用程序是一个内核级电压频率调节器(即它可以替代按需调节器)。因为我需要访问系统级别的性能计数器,而不是附加到特定的程序运行时,所以我没有使用现有的实用程序,例如 PAPI 或 Linux 的 perf 工具。根据我过去使用这两种方法的经验,我知道它们更适合用来监视特定程序或检测二进制文件的性能统计数据。
我已经实现了一个内核模块,该模块定期将多个硬件计数器值更新到 sysfs 端点。我使用过的资源包括:
我当前用于测量 L2 未命中的硬件计数器是事件 0x17:“L2 数据缓存重新填充”。即使在运行数据量较大的基准测试时,打印此值始终会给出 0。我应该使用不同的事件或事件集来确定 L2 缓存未命中吗?也许是 0x13,“数据内存访问”,或者某些事件的组合?
我的问题的根源很可能是对“L2 数据缓存重新填充”的误解,但我无法通过文档和堆栈溢出搜索找到对此的澄清。
编辑:我发现 L2 笔芯读数为 0,因为第 5 个硬件计数器由于某种原因未按预期工作;将 L2 笔芯重新分配给不同的计数器已经解决了这个特定问题。
编辑2:第5个硬件计数器不起作用,因为我没有启用那么多。愚蠢的我。
我想知道如何在 Mac 上获取性能监控计数器测量值。在 Linux 中,我们可以使用“perf stat”命令来获取测量结果。使用 Mac 就更难了。具体来说,我想知道如何获得从命令行运行的程序的分支错误预测数量和执行的分支数量,最好不重新编译程序。我已经做了一些谷歌搜索,但我需要的是一个解决方案;如果你能告诉我如何打开终端,输入一些命令(也许使用你下载的一些工具),并获得错误预测的数量,比如 /bin/ls,那就太好了。
我有一个python脚本调用基于USB的数据采集C#dotnet可执行文件.主要的python脚本做了许多其他的事情,例如它控制步进电机.我们想检查各种操作的相对时间,为此目的,dotnet exe生成一个带有来自C#Stopwatch.GetTimestamp()的时间戳的日志,据我所知,它产生与调用win32 API QueryPerformanceCounter()相同的数字.
现在我想从python脚本中获得类似的数字.time.clock()返回这样的值,不幸的是它将第一次调用时获得的值减去time.clock().我怎么能绕过这个?从一些现有的python模块调用QueryPerformanceCounter()是否容易,或者我是否必须在C中编写自己的python扩展?
我忘了提及,Tim Golden的python WMI模块做到了这一点:wmi.WMI().Win32_PerfRawData_PerfOS_System()[0] .Timestamp_PerfTime,但它太慢了,开销大约48ms.我需要一些<= 1ms的开销.time.clock()似乎足够快,就像c#Stopwatch.GetTimestamp()一样.
TIA,Radim
我想通过记录业务事件来开始监视应用程序的性能.我正在寻找与log4net或其他日志库类似的东西,但是为性能/健康监控量身定制.
我的目标是使用性能计数器发布这些业务事件,但我真的不觉得用性能计数器代码丢弃我的代码是个好主意.就像log4net抽象注销一样,是否有一个现有的库将性能/健康监控抽象到自己的库中?
我在玩弄QueryPerformanceFrequency.它过去常常返回3.6 Mhz,但这还不足以让我尝试做什么.
我启用了HPET这个命令bcdedit /set useplatformclock true.现在它又回来了14.3 Mhz.它更精确,更精确......除非它不是.我很快意识到我没有达到我预期的粒度.
如果我尝试轮询QueryPerformanceCounter直到它滴答作响,我可以获得的最小增量是11,这意味着1.27Mhz.如果我试着计算QueryPerformanceCounter一秒钟内可以得到的不同值的数量,我得到1.26Mhz.
所以我想知道有没有办法真正14.3 Mhz充分利用它?
我正在使用Windows 7,64位系统,visual studio 2008.
我正在使用System.Data PerfomanceCounter该类,我已经找到了一些如何检索磁盘空间或CPU使用率的非常具体的示例.
但是,我无法找到有关可能值的文档:
PerfomanceCounter.CategoryName
PerformanceCounter.CounterName
PerformanceCounter.InstanceName
Run Code Online (Sandbox Code Playgroud)
我可以从类中看到我可以传递给构造函数的不同参数,但是即使转到说出CategoryName的页面也没有给我一个可用值列表.
任何人都可以提供有关如何找到这些值的可用值的建议吗?
谢谢!