c ++数组赋值时间

时间:2017-11-22 10:31:21

标签: c++ arrays time

我想知道在c ++中为数组分配值需要多长时间 我测试了一个代码,它分配了数组arr = 0然后,arr来改变值,如果arr> 20.

#include<iostream>
#include < windows.h >

using namespace std;

#define N 100000000
int arr[N] = { 0, };

int main(){
    int d;

    int *data;
    data = arr;

    double start = GetTickCount();
    for(int i = 0; i < N; i++){
        if (data[i] > 20){ //All data is zero
            // d = data[i];
            data[i] = 10;
        }
    }

    double end = GetTickCount();
    cout << (end - start) / (double)1000 << endl;

    return -1;
}

我认为没有分配给arr的数据, 因为所有数据都小于20,
因此计算时间应接近0.但计算时间为0.188s 是什么原因?
环境:视觉工作室2013社区
编译选项(optimaztion):/ 02(0.188s),/ Ox(0.141)

3 个答案:

答案 0 :(得分:1)

您说得对:在您的计划中,作业所需的总时间为0。 但是程序不会减少到分配,它还包含测试(并且在较低级别跳转以允许循环和条件)。在这里你要求进行1亿次测试...

当然,普通人可以很容易地推断出当数组被初始化为0并且从未被修改时,所有测试都将返回false并且循环只是一个无操作并且可以被优化掉。但不幸的是,对于大多数编译器而言,这太复杂了,恕我直言,大多数人只会执行所有测试,这会花费观察到的持续时间。

答案 1 :(得分:0)

你看到的可能是迭代100米阵列的原始时间。

理论上,如果编译器以某种方式推断出数组被零填充,它可能会改变,因此,永远不会执行if分支。在这种情况下,它可能会删除循环。

我还没有遇到过这样的智能编译器。

答案 2 :(得分:0)

唯一可以确定的方法是检查编译器输出的代码,确定编译器对循环执行的操作(完全删除它,用一些更简单的构造替换它,为它发出代码)“ “)。

默认情况下,大多数现代编译器都配置为不优化性能。如果需要这样的优化,则需要专门启用它(IDE​​设置或特定于编译器的命令行选项,具体取决于您调用编译器的方式)。

即使启用了优化,编译器也可能无法优化循环。 GetTickCount()是一个库函数,特别是因为arr是全局的 - 编译器可能会考虑它影响arr中存储的数据的可能性 - 这意味着它不能优化完全循环存在。由于它是一个Windows API函数,因此针对Windows的编译器可能具有GetTickCount()所做内容的“内置”知识,但这并不能保证。如果没有这样的内置知识,编译器可能会在优化时不那么具有侵略性(或更保守)。

使用别名(例如你的指针引用数组的情况),编译器也可以保守地播放它。

无论编译器做什么,测量的时间都会受到主机系统负载的影响(例如,其他程序正在消耗CPU周期)。