我有兴趣比较一些 C++ 与 Python(在 Linux 上运行)编写的代码部分的 CPU 时间。以下方法会在两者之间产生“公平”的比较吗?
Python
使用资源模块:
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
。
关注点:
- 我读过 C++
clock()
测量 CPU 时间,这是我所追求的,但我似乎无法找到它是否包括用户和系统时间。 - C++ 的结果不那么精确。这是为什么?
- 如前所述,比较的总体公平性。
更新
根据 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
可以让我得到更好的分辨率,但我不确定我应该读多少。设置优化标志肯定会产生很大的不同。