如何测量 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 rusageru_utime 字段中。 ru_stime 计算系统时间。

【讨论】:

以上是关于如何测量 Linux 和 Windows 中函数的“用户”执行时间的主要内容,如果未能解决你的问题,请参考以下文章

C++:从程序、Windows 和 Linux 中测量内存使用情况 [重复]

如何在 Linux 多线程环境中测量函数的总执行时间

如何启用 TPM 测量启动并在 Windows 10 中查看 pcr 值? [关闭]

测量linux模块中函数的执行时间和调用次数

测量linux内核中函数的执行时间

如何测量代码片段的调用次数和经过时间