如何测量 Linux 和 Windows 中函数的“用户”执行时间
Posted
技术标签:
【中文标题】如何测量 Linux 和 Windows 中函数的“用户”执行时间【英文标题】:How to measure the 'user' time execution of a function in Linux and Windows 【发布时间】:2013-04-04 11:14:50 【问题描述】:如果我有一个函数 foo 我想分析它的“用户”时间(删除内核或其他进程时间),我如何在代码中测量它(C/C++)?
我知道以下函数:
Windows
-
查询性能计数器
GetProcessTimes
Linux
-
gettimeofday
次
时钟
还有更多方法吗?每个都提供了不同的时间“视图”,并没有真正提供准确的结果。
【问题讨论】:
我不了解windows,但我在linux上使用了timeofday,它非常准确。这也是linux上的常态。 【参考方案1】:Linux 上最好的方法如下:(从 Linux 内核 perf_event_open 手册页中提取和修改)
代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/ioctl.h>
#include <linux/perf_event.h>
#include <asm/unistd.h>
long
perf_event_open(struct perf_event_attr *hw_event, pid_t pid,
int cpu, int group_fd, unsigned long flags)
int ret;
ret = syscall(__NR_perf_event_open, hw_event, pid, cpu,
group_fd, flags);
return ret;
int
main(int argc, char **argv)
struct perf_event_attr pe;
long long count;
int fd;
memset(&pe, 0, sizeof(struct perf_event_attr));
pe.type = PERF_TYPE_HARDWARE;
pe.size = sizeof(struct perf_event_attr);
pe.config = PERF_COUNT_HW_INSTRUCTIONS;
pe.disabled = 1;
pe.exclude_kernel = 1;
pe.exclude_hv = 1;
fd = perf_event_open(&pe, 0, -1, -1, 0);
if (fd == -1)
fprintf(stderr, "Error opening leader %llx\n", pe.config);
exit(EXIT_FAILURE);
ioctl(fd, PERF_EVENT_IOC_RESET, 0);
ioctl(fd, PERF_EVENT_IOC_ENABLE, 0);
printf("Measuring instruction count for this printf\n");
ioctl(fd, PERF_EVENT_IOC_DISABLE, 0);
read(fd, &count, sizeof(long long));
printf("Used %lld instructions\n", count);
close(fd);
【讨论】:
【参考方案2】:在类 Unix 系统上 getrusage
是您正在寻找的。特别是 RUSAGE_SELF
选项。用户时间将在struct rusage
的ru_utime
字段中。 ru_stime
计算系统时间。
【讨论】:
以上是关于如何测量 Linux 和 Windows 中函数的“用户”执行时间的主要内容,如果未能解决你的问题,请参考以下文章
C++:从程序、Windows 和 Linux 中测量内存使用情况 [重复]