我想知道在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)
答案 0 :(得分:1)
您说得对:在您的计划中,作业所需的总时间为0。 但是程序不会减少到分配,它还包含测试(并且在较低级别跳转以允许循环和条件)。在这里你要求进行1亿次测试...
当然,普通人可以很容易地推断出当数组被初始化为0并且从未被修改时,所有测试都将返回false并且循环只是一个无操作并且可以被优化掉。但不幸的是,对于大多数编译器而言,这太复杂了,恕我直言,大多数人只会执行所有测试,这会花费观察到的持续时间。
答案 1 :(得分:0)
你看到的可能是迭代100米阵列的原始时间。
理论上,如果编译器以某种方式推断出数组被零填充,它可能会改变,因此,永远不会执行if
分支。在这种情况下,它可能会删除循环。
我还没有遇到过这样的智能编译器。
答案 2 :(得分:0)
唯一可以确定的方法是检查编译器输出的代码,确定编译器对循环执行的操作(完全删除它,用一些更简单的构造替换它,为它发出代码)“ “)。
默认情况下,大多数现代编译器都配置为不优化性能。如果需要这样的优化,则需要专门启用它(IDE设置或特定于编译器的命令行选项,具体取决于您调用编译器的方式)。
即使启用了优化,编译器也可能无法优化循环。 GetTickCount()
是一个库函数,特别是因为arr
是全局的 - 编译器可能会考虑它影响arr
中存储的数据的可能性 - 这意味着它不能优化完全循环存在。由于它是一个Windows API函数,因此针对Windows的编译器可能具有GetTickCount()
所做内容的“内置”知识,但这并不能保证。如果没有这样的内置知识,编译器可能会在优化时不那么具有侵略性(或更保守)。
使用别名(例如你的指针引用数组的情况),编译器也可以保守地播放它。
无论编译器做什么,测量的时间都会受到主机系统负载的影响(例如,其他程序正在消耗CPU周期)。