C++ 时钟()-循环前后的值相同
我有一个简单的代码:C++ 时钟()-循环前后的值相同,c++,C++,我有一个简单的代码: #include <iostream> #include <ctime> using namespace std; int main(int argc, char **argv) { cout << clock() << endl; for(int i = 0; i < 100; i++){ int k = i * i; } cout << clock(
#include <iostream>
#include <ctime>
using namespace std;
int main(int argc, char **argv)
{
cout << clock() << endl;
for(int i = 0; i < 100; i++){
int k = i * i;
}
cout << clock() << endl;
return 0;
}
#包括
#包括
使用名称空间std;
int main(int argc,字符**argv)
{
cout未指定时钟的分辨率;最早
在我使用它的系统中,它是20毫秒(1/50秒)
第二,对应于我居住的线路频率)。
现代Unix要求定义每秒时钟数
1000000
,但它仍然没有对
实际分辨率。还有一百次乘法,等等
一台现代化的机器,可能只需要几分钟
微秒,如果是的话。远低于
时钟
另外,当然,编译器可以完全优化循环,因为它对程序的可观察行为没有影响。循环可能被优化了,因为它什么也不做-在循环中做一些有意义的事情(例如,cout
something)您应该会看到不同之处。您在编译时是否使用了任何标志?可能需要0(µs?)才能执行,或者可能由于您不使用k
,所以对其进行了优化。后者似乎是一个不错的选择。编译器是(相对而言)聪明。@PaulR我用-O0
编译来防止优化。仍然是一样的。@keyserg++-O0-o cl.cpp
。另请看我上面的评论。@PerakR:即使没有优化,循环的作用也很小,因此经过的时间可能太小,无法测量-尝试向循环中添加cout
。谢谢,这是pr可能是因为我编译后的分辨率阻止了优化。我想我会使用clock\u gettime()
。不管你使用什么,你都必须处理它的分辨率。没有无限分辨率的时钟,100次乘法会推送你可能遇到的任何时钟。(测量值也会受到调用函数所需时间的影响,其中的抖动可能会大于执行100次乘法所需的抖动。)是的,谢谢。不过,clock_gettime()
的分辨率确实高于clock()
,不是吗?对于其他阅读本文的人,我发现以下一些文章很有帮助。@PerakR所有情况下的解决方案都是由实现定义的;我希望时钟
基于一个底层时钟,可以与时钟_gettime
一起使用,但很容易会有更精确的时钟。而且不管是什么对于分辨率,您必须考虑调用本身不是零时间的事实,并引入一些抖动。