我有一个基准测试应用程序来测试我编写的一些API的性能.在这个基准测试应用,我基本上使用QueryPerformanceCounter和除以QPC值的差异之后和调用API时,由频率之前得到的时机.但基准测试结果似乎有所不同如果我从不同的驱动器运行应用程序(在同一组Dll上运行相同的可执行文件).此外,在特定驱动器上,第一次运行应用程序,关闭应用程序并再次重新运行它会产生不同的基准测试结果.谁能解释这种行为?我在这里错过了什么吗?
一些更有用的信息:
该行为是这样的:运行该应用程序,关闭它,并重新运行它,在基准测试结果看来,以提高对第二次运行和以后保持不变.在从C盘运行的情况下,此行为更加突出.我还想提一下,我的基准测试应用程序可以选择重新运行/重新测试特定的API,而无需关闭应用程序.我不明白,有jitting参与,但我不明白的是,在应用程序的第一次运行时,当U多次重新运行的API,但不关闭应用程序,表现一对夫妇运行的稳定后,则当您关闭并重新运行同样的测试,性能似乎有所改善.
另外,如何在从不同驱动器运行时考虑性能变化?
[资讯更新]
我做了一个ngen,现在来自同一地点的不同跑步之间的性能差异消失了.即如果我打开基准测试应用程序,运行一次,关闭它并从同一位置重新运行它,它显示相同的值.
但我现在遇到了另一个问题.当我启动从d驱动的应用程序,(相同的启动基准PROG内夫妇的API的迭代)运行几次,然后从开始第三次迭代,所有API的表现似乎由20%左右下降.然后,如果关闭并重新启动应用程序并运行它,前2次迭代,它给出正确的值(相同的值由C获得),然后再次下降的表现超出.从C驱动器运行时看不到此行为.从C盘开始,无论您运行多少次,都非常一致.
我使用大型双数组来测试我的API性能.我担心GC会在测试之间启动,所以我在每次测试之前和之后明确地调用GC.Collect()和GC.WaitForPendingFinalizers().所以我不认为它与GC有任何关系.
我尝试使用AQ时间来了解从第3次迭代开始发生的事情,但有趣的是,当我使用AQ时间分析它运行应用程序时,性能根本没有下降.
性能计数器并不表示任何有趣的IO活动.
谢谢Niranjan
如果我每 N 秒监控一次 ASP.NET Requests/sec 性能计数器,我应该如何解释这些值?是采样间隔内处理的请求数除以 N 吗?或者无论采样间隔如何,它都是当前请求/秒?
我已经阅读了一些有关QPC实施的问题和不准确性的内容.但所有这些讨论和文章似乎都过时了.
任何人都知道最新的Win7 OS和Intel/AMD cpu上的QPC功能的当前状态是什么?有没有改进?例如Turbo Boost仍然是一个大问题吗?
我主要对此感兴趣,因为我需要决定在我的应用程序中使用timeGetTime和QueryPerformanceCounter进行计时.
我有一个 Web 服务,它创建自己的单实例性能计数器。当池关闭(或回收/重新启动 IIS)并且 perfmon 重新启动时,我的 int64 计数器全部返回到 0。有没有办法创建类别和/或计数器,以便它们“幸存”应用程序关闭?
我正在尝试使用性能计数器来确定我的应用程序发送或接收的字节数.我按照此处找到的建议解决方案:计算带宽,但我的应用程序实例未显示在".NET CLR网络"类别中.异常消息:
"实例'ApplicationName [8824]'在指定的类别中不存在"
(我已经<performanceCounters enabled="true"/>在我的App.config中添加了它仍然在一些网络活动后找不到)
所以我启动了性能监视器,所以我亲眼看到错误.正如预期的那样,我的应用程序没有出现在.NET CLR Networking类别中,但幸运的是可以在.NET CLR Networking 4.0.0.0类别中找到它.
但是,我的问题是我无法弄清楚如何生成实例名称.这是我在性能监视器中看到的实例的名称:ApplicationName.exe_p4952_r15_ad1.
到目前为止,我已经发现第一部分必须由ProcessName和PID组成,但我不知道最后两部分("r15"和"ad1")的部分来自何处.
有人知道最后两件可能是什么吗?
一种解决方案是枚举".NET CLR Networking 4.0.0.0"类别中找到的所有实例并搜索ApplicationName.exe_PID*,但更愿意直接查找正确的名称(如果可能).
默认情况下,GetTickCount 和 timeGetTime 具有相同的分辨率 - 15.625ms,但是在我调用 timeBeginPeriod(1) 之后,GetTickCount 仍然每 15.625 ms 更新一次,而 timeGetTime 每 1ms 更新一次,这是为什么?
在等待计时器中的错误?,作者提到:

我想知道:为什么GetTickCount和timeGetTime来自同一个RTC,但有两种分辨率?
谢谢!
我正在尝试学习如何监视特定应用程序的网络带宽使用情况。我正在查看IPv4InterfaceStatistics,但这似乎监视NIC卡的性能。
我想监视特定的应用程序,以查看每秒消耗多少带宽。
有谁知道如何做到这一点的例子?
大家都知道,perf是为了得到一个程序的CPU性能计数器的工具,如cache-miss,cache-reference,instruction executed等。
问题:
如何在c或c++.
例如,我的程序首先进行一些初始化,然后进行工作,然后完成,我只想获得工作的性能计数器,例如 function do_something_1。
int main(int argc, char ** argv) {
do_initialize();
for (int i = 0;i < 100 ;i ++) {
/* begin profile code */
do_something_1();
/* end profile code */
do_something_2();
}
do_finalize();
}
Run Code Online (Sandbox Code Playgroud) 作为应用程序的一部分,我正在尝试使用 Windows 性能计数器来监视机器运行状况。我有一些 DataCollector 配置为将数据写出为 CSV 或 BLG 格式。但是,我注意到时间戳没有每个样本时间戳的 TZ 信息,每个文件只有一次。这意味着在单个数据文件中,我将看到以下内容:
"(PDH-CSV 4.0) (GMT Standard Time)(-60)","\\MACHINE-NAME\% C2 Time"
"10/29/2017 01:59:44.562","88.359340674585567"
"10/29/2017 01:59:59.562","93.754278507632279"
"10/29/2017 01:00:14.562","89.834673388599242"
"10/29/2017 01:00:29.563","94.014449309223536"
Run Code Online (Sandbox Code Playgroud)
类似地,在转换中,您会看到丢失了一个小时的数据(与该小时离线的机器相比,这更难消除歧义)。
我认为二进制数据可能会存储更多信息,因此我也以 BLG 格式创建了相同的指标,并使用 PowerShell 读取信息。但是,在这种情况下,我仍然无法获取每个时间戳的时区信息。例如,
# $counters = Import-Counter -Path mysamples.blg
# $counters[10].Timestamp
29 October 2017 01:59:59
# $counters[11].Timestamp
29 October 2017 01:00:14
# $counters[10].Timestamp.IsDaylightSavingTime()
False
# $counters[11].Timestamp.IsDaylightSavingTime()
False
# $counters[10].Timestamp.ToFileTimeUtc()
131537159995620000
# $counters[11].Timestamp.ToFileTimeUtc()
131537124145620000
Run Code Online (Sandbox Code Playgroud)
有没有办法获得与性能计数器数据中的时间戳相关联的正确 TZ 信息,或者是否有办法将 UTC 时间添加到日志而不是 TZ 偏移时间戳?
以下代码片段仅使用一条RET指令创建一个函数(fun).循环重复调用该函数并在返回后覆盖RET指令的内容.
#include <sys/mman.h>
#include<stdlib.h>
#include<unistd.h>
#include <string.h>
typedef void (*foo)();
#define RET (0xC3)
int main(){
// Allocate an executable page
char * ins = (char *) mmap(0, 4096, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_PRIVATE| MAP_ANONYMOUS, 0, 0);
// Just write a RET instruction
*ins = RET;
// make fun point to the function with just RET instruction
foo fun = (foo)(ins);
// Repeat 0xfffffff times
for(long i = 0; i < 0xfffffff; i++){
fun();
*ins = RET;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
X86 Broadwell机器上的Linux perf具有以下icache和iTLB统计信息: …