这里有一个复制粘贴的解决方案,适用于Windows和Linux以及C和C++。
如评论中所述,有一种名为boost的库可以实现此功能。但如果不能使用boost,这个解决方案应该能够解决问题:
#ifdef _WIN32
#include <Windows.h>
double get_wall_time(){
LARGE_INTEGER time,freq;
if (!QueryPerformanceFrequency(&freq)){
return 0;
}
if (!QueryPerformanceCounter(&time)){
return 0;
}
return (double)time.QuadPart / freq.QuadPart;
}
double get_cpu_time(){
FILETIME a,b,c,d;
if (GetProcessTimes(GetCurrentProcess(),&a,&b,&c,&d) != 0){
return
(double)(d.dwLowDateTime |
((unsigned long long)d.dwHighDateTime << 32)) * 0.0000001;
}else{
return 0;
}
}
#else
#include <time.h>
#include <sys/time.h>
double get_wall_time(){
struct timeval time;
if (gettimeofday(&time,NULL)){
return 0;
}
return (double)time.tv_sec + (double)time.tv_usec * .000001;
}
double get_cpu_time(){
return (double)clock() / CLOCKS_PER_SEC;
}
#endif
有许多方法来实现这些时钟。但是以下的代码片段使用了以下方式:
对于Windows系统:
对于Linux系统:
这里有一个小演示:
#include <math.h>
#include <iostream>
using namespace std;
int main(){
double wall0 = get_wall_time();
double cpu0 = get_cpu_time();
double sum = 0;
#pragma omp parallel for reduction(+ : sum)
for (long long i = 1; i < 10000000000; i++){
sum += log((double)i);
}
double wall1 = get_wall_time();
double cpu1 = get_cpu_time();
cout << "Wall Time = " << wall1 - wall0 << endl;
cout << "CPU Time = " << cpu1 - cpu0 << endl;
cout << endl;
cout << "Sum = " << sum << endl;
}
输出(12个线程):
Wall Time = 15.7586
CPU Time = 178.719
Sum = 2.20259e+011
time
,但正如你所写的,我需要直接在C代码中实现。 - yakclock()
提供墙钟时间,而GetProcessTimes
提供CPU时间。在Linux上,gettimeofday()
提供墙钟时间,而clock()
提供CPU时间。 - Mysticialboost::auto_cpu_timer
(http://boost.org/libs/timer)就是你需要的。你只需这样编写代码:`boost::auto_cpu_timer t; function(args);`(是的,没有cout,什么都没有,就这样,你就可以得到墙上时间和CPU时间——我喜欢这个功能)。 - lip