C++时钟保持零
C++ clock stays zero
我试图获取我的程序的经过时间。实际上我认为我应该使用time.h
的yclock()
。但是尽管我添加了 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
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;
}
获取时间的最简单方法是使用 OpenMP 中的存根函数。 这将适用于MSVC,GCC和ICC。 使用 MSVC,您甚至不需要启用 OpenMP。 使用ICC,如果您愿意,可以仅链接存根-openmp-stubs
。 使用 GCC,您必须使用 -fopenmp
.
#include <omp.h>
double dtime;
dtime = omp_get_wtime();
foo();
dtime = omp_get_wtime() - dtime;
printf("time %fn", dtime);
首先,编译器很可能优化你的代码。检查编译器的优化选项。
由于连续代码不使用包含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 对于性能测试来说太小了,现在计算机以 100000 的比例使用 o(n) 代码运行得非常快。
unsigned int N = 10000000;
将其添加到代码末尾
int sum = 0;
for(int i = 0; i<N; i++)
sum += out[i];
cout << sum;
然后你会看到时间。
由于您不使用a[], b[], out[]
因此它会忽略相应的循环。这是因为编译器的优化。
另外,要查看所需的确切时间,请使用debug mode
而不是release
,然后您将能够看到所需的时间。
- 在C++/Linux中设置单调时钟的一些技巧
- 从文本文件中读取时钟时间和事件时间并进行处理
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 用时钟测量程序的运行时间
- 如何在C++中为高分辨率时钟声明变量?
- 如何在 C++17 中检索 std::filesystem::file_time_type 的时钟类型
- 我的时钟函数在 c++ 函数中不起作用
- 不同机器之间的标准时钟性能差异显著
- 计时库中的时钟和琐碎时钟概念
- 如何使用 CTIME/Chrono Libarey 将开始时间与系统时钟进行比较
- 如何在给定时钟偏移的情况下正确获取时间
- 使用时钟"storing"特定时间
- 时钟功能返回零时差
- 开发简单的时钟和日期类时遇到问题
- 标准::计时::时钟、硬件时钟和周期计数
- C++ 和 C# 中的等效系统时钟毫秒?
- time_t的时钟周期和获取时间问题
- 在SFML中,时钟有限制吗?
- 如何在Vxworks中正确运行时钟获取时间以获得准确的时间
- 我正在用 c++ 制作一个小时钟,但遇到了"bug"或某种问题