gpt4 book ai didi

python - 这是 C++ 和 Python 之间比较 CPU 时间的有效方法吗?

转载 作者:太空狗 更新时间:2023-10-29 21:43:13 25 4
gpt4 key购买 nike

我有兴趣比较一些 C++ 和 Python(在 Linux 上运行)编写的代码部分的 CPU 时间。以下方法会在两者之间产生“公平”的比较吗?

python

使用 resource module :

import resource
def cpu_time():
return resource.getrusage(resource.RUSAGE_SELF)[0]+\ # time in user mode
resource.getrusage(resource.RUSAGE_SELF)[1] # time in system mode

允许这样的时间安排:

def timefunc( func ):
start=cpu_time()
func()
return (cpu_time()-start)

然后我像这样测试:

def f():
for i in range(int(1e6)):
pass

avg = 0
for k in range(10):
avg += timefunc( f ) / 10.0
print avg
=> 0.002199700000000071

C++

使用 ctime 库:

#include <ctime>
#include <iostream>

int main() {
double avg = 0.0;
int N = (int) 1e6;
for (int k=0; k<10; k++) {
clock_t start;
start = clock();
for (int i=0; i<N; i++) continue;
avg += (double)(clock()-start) / 10.0 / CLOCKS_PER_SEC;
}
std::cout << avg << '\n';
return 0;
}

产生 0.002

问题:

  1. 我读过 C++ clock() 测量 CPU 时间,这正是我所追求的,但我似乎找不到它是否包括用户和系统时间。
  2. C++ 的结果不够精确。这是为什么?
  3. 如前所述,比较的整体公平性。

更新

根据 David 在评论中的建议更新了 C++ 代码:

#include <sys/resource.h>
#include <iostream>

int main() {
double avg = 0.0;
int N = (int) 1e6;
int tally = 0;

struct rusage usage;
struct timeval ustart, ustop, sstart, sstop;

getrusage(RUSAGE_SELF, &usage);
ustart = usage.ru_utime;
sstart = usage.ru_stime;

for (int k=0; k<10; k++) {
ustart = usage.ru_utime;
sstart = usage.ru_stime;

for (int i=0; i<N; i++) continue;

getrusage(RUSAGE_SELF, &usage);
ustop = usage.ru_utime;
sstop = usage.ru_stime;

avg += (
(ustop.tv_sec+ustop.tv_usec/1e6+
sstop.tv_sec+sstop.tv_usec/1e6)
-
(ustart.tv_sec+ustart.tv_usec/1e6+
sstart.tv_sec+sstart.tv_usec/1e6)
) / 10.0;
}

std::cout << avg << '\n';

return 0;
}

运行:

g++ -O0 cpptimes.cpp ; ./a.out
=> 0.0020996
g++ -O1 cpptimes.cpp ; ./a.out
=> 0

所以我想 getrusage 让我得到了更好的解决方案,但我不确定我应该阅读多少内容。设置优化标志肯定会产生很大的不同。

最佳答案

documentation说:

返回自与程序执行相关的实现定义时代开始以来进程使用的大致处理器时间。要将结果值转换为秒,请将其除以 CLOCKS_PER_SEC。

这很模糊。 CLOCK_PER_SEC 设置为 10^6,近似值表示分辨率较差,而不是当前时钟快 1000 以上且结果四舍五入。这可能不是一个非常专业的术语,但它是合适的。我测试的所有地方的实际分辨率约为 100Hz = 0,01s。多年来一直如此。注意这里的日期http://www.guyrutenberg.com/2007/09/10/resolution-problems-in-clock/ .

然后文档后面是:“在 POSIX 兼容系统上,时钟 ID 为 CLOCK_PROCESS_CPUTIME_ID 的 clock_gettime 提供更好的分辨率。

所以:

  1. 这只是 CPU 时间。但是 2 个线程 = 2*CPU 时间。请参阅有关 cppreference 的示例。

  2. 如上所述,它根本不适合细粒度测量。您处于其准确性的边缘。

  3. IMO 测量挂钟是唯一明智的事情,但它是一个相当个人的意见。特别是对于多线程应用程序和一般的多处理。否则 system+user 的结果应该是相似的。

编辑:在 3。这当然适用于计算任务。如果您的进程使用 sleep 或放弃执行返回系统,测量 CPU 时间可能更可行。另外关于 clock 分辨率是错误的评论......不好。是的,但公平地说,你不应该测量这么短的计算。 IMO 太糟糕了,但如果你在几秒钟内测量时间,我想它很好。我会亲自使用其他可用的工具。

关于python - 这是 C++ 和 Python 之间比较 CPU 时间的有效方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23500173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com