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
编译来防止优化。仍然是一样的。@keyser
g++-O0-o cl.cpp
。另请看我上面的评论。@PerakR:即使没有优化,循环的作用也很小,因此经过的时间可能太小,无法测量-尝试向循环中添加
cout
。谢谢,这是pr可能是因为我编译后的分辨率阻止了优化。我想我会使用
clock\u gettime()
。不管你使用什么,你都必须处理它的分辨率。没有无限分辨率的时钟,100次乘法会推送你可能遇到的任何时钟。(测量值也会受到调用函数所需时间的影响,其中的抖动可能会大于执行100次乘法所需的抖动。)是的,谢谢。不过,
clock_gettime()
的分辨率确实高于
clock()
,不是吗?对于其他阅读本文的人,我发现以下一些文章很有帮助。@PerakR所有情况下的解决方案都是由实现定义的;我希望
时钟
基于一个底层时钟,可以与
时钟_gettime
一起使用,但很容易会有更精确的时钟。而且不管是什么对于分辨率,您必须考虑调用本身不是零时间的事实,并引入一些抖动。