我正在尝试获取程序的已用时间。实际上我认为我应该使用yclock()
中的time.h
。但它在程序的所有阶段都保持为零,尽管我添加了10 ^ 5个数字(必须消耗一些CPU时间)。我已经搜索过这个问题,看起来,运行Linux的人只有这个问题。我正在运行Ubuntu 12.04LTS。
我将比较AVX和SSE指令,因此使用time_t
并不是一个真正的选择。任何提示?
以下是代码:
//Dimension of Arrays
unsigned int N = 100000;
//Fill two arrays with random numbers
unsigned int a[N];
clock_t start_of_programm = clock();
for(int i=0;i<N;i++){
a[i] = i;
}
clock_t after_init_of_a = clock();
unsigned int b[N];
for(int i=0;i<N;i++){
b[i] = i;
}
clock_t after_init_of_b = clock();
//Add the two arrays with Standard
unsigned int out[N];
for(int i = 0; i < N; ++i)
out[i] = a[i] + b[i];
clock_t after_add = clock();
cout << "start_of_programm " << start_of_programm << endl; // prints
cout << "after_init_of_a " << after_init_of_a << endl; // prints
cout << "after_init_of_b " << after_init_of_b << endl; // prints
cout << "after_add " << after_add << endl; // prints
cout << endl << "CLOCKS_PER_SEC " << CLOCKS_PER_SEC << endl;
控制台的输出。我还将printf()
与%d
一起使用,没有区别。
start_of_programm 0
after_init_of_a 0
after_init_of_b 0
after_add 0
CLOCKS_PER_SEC 1000000
答案 0 :(得分:5)
clock
确实返回使用的CPU时间,但粒度大约为10Hz。因此,如果您的代码不超过100毫秒,您将获得零。除非它显着超过100毫秒,否则您将无法获得非常准确的值,因为它的误差范围将在100毫秒左右。
因此,增加N或使用不同的方法来测量时间将是您的选择。 std::chrono
很可能会产生更准确的时间(但它会测量“挂壁时间”,而不是CPU时间)。
timespec t1, t2;
clock_gettime(CLOCK_REALTIME, &t1);
... do stuff ...
clock_gettime(CLOCK_REALTIME, &t2);
double t = timespec_diff(t2, t1);
double timespec_diff(timespec t2, timespec t1)
{
double d1 = t1.tv_sec + t1.tv_nsec / 1000000000.0;
double d2 = t2.tv_sec + t2.tv_nsec / 1000000000.0;
return d2 - d1;
}
答案 1 :(得分:2)
获得时间的最简单方法是使用OpenMP中的存根函数。这适用于MSVC,GCC和ICC。使用MSVC,您甚至不需要启用OpenMP。使用ICC,如果您喜欢-openmp-stubs
,则可以仅链接存根。通过GCC,您have to use -fopenmp
。
#include <omp.h>
double dtime;
dtime = omp_get_wtime();
foo();
dtime = omp_get_wtime() - dtime;
printf("time %f\n", dtime);
答案 2 :(得分:1)
首先,编译器很可能会优化您的代码。检查编译器的优化选项。
由于连续代码不使用包含out[], a[], b[]
的数组,并且不输出out[], a[], b[]
的值,编译器将按如下方式优化代码块,如从不执行:
for(int i=0;i<=N;i++){
a[i] = i;
}
for(int i=0;i<=N;i++){
b[i] = i;
}
for(int i = 0; i < N; ++i)
out[i] = a[i] + b[i];
由于clock()
函数返回CPU时间,因此上述代码在优化后几乎不消耗任何时间。
还有一件事,将N设为更大的值。 100000对于性能测试来说太小了,现在计算机运行速度非常快,o(n)代码为100000。
unsigned int N = 10000000;
答案 3 :(得分:0)
将其添加到代码的末尾
int sum = 0;
for(int i = 0; i<N; i++)
sum += out[i];
cout << sum;
然后你会看到时间。
由于你不使用a[], b[], out[]
,它会忽略相应的for循环。这是因为编译器的优化。
此外,要查看使用debug mode
代替release
所需的确切时间,您将能够看到所需的时间。