C 数组值分配时间
c++ array value assignment time
我想知道将值分配为C 中的数组需要多长时间。
我测试一个分配array arr = 0的代码,然后,如果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.188。
原因是什么?
环境:Visual Studio 2013 Community
编译选项(Optimaztion):/O2(0.188S),/ox(0.141)
您在一点点:分配所花费的总时间是您的程序中的0。但该程序并未减少为作业,它还包含测试(并且在较低级别的跳跃以允许循环和有条件)。在这里您要求100000000个测试...
当然,正常的人可以轻松地推断出该数组的初始化为0,并且从未修改,所有测试将返回false,并且循环只是一个no-op,并且可以优化。但是不幸的是,对于大多数编译器而言,这太复杂了,恕我直言,大多数只会执行所有测试,它花费了观察到的持续时间。
您看到的可能是100m数组上迭代的原始时间。
理论上,如果编译器以某种方式推论数组中充满了零,则可能会更改,因此,if
分支将永远不会执行。在这种情况下,它可能会删除循环。
我尚未遇到如此聪明的编译器。
确保唯一的方法是检查编译器输出哪个代码,以确定编译器使用循环所做的操作(完全将其删除,用一些更简单的构造代替它,"按原样"发出代码。
默认情况下,大多数现代编译器都配置为不优化性能。如果需要此类优化,则需要具体启用它(根据您调用编译器的方式,IDE设置或特定于编译器的命令行选项)。
即使启用了优化,编译器也可能不会优化不存在的循环。GetTickCount()
是库函数,尤其是 - 尤其是因为arr
是全局 - 编译器可能允许其影响arr
中存储的数据的可能性 - 这意味着它不能完全不完全优化存在的循环。由于它是一个Windows API函数,因此针对Windows的编译器可能对GetTickCount()
具有"内置"知识,但不能保证。没有这样的内置知识,编译器的优化可能会不那么积极(或更保守)。
在游戏中混音(例如,您的指针引用数组的情况)也可以保守地播放。
无论编译器做什么,测量时间都会受主机系统上的负载影响(例如,其他哪些程序正在消耗CPU周期)。
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 多次分配内存是否一次性需要更多时间?
- C++计划持续时间内(字体)资源的分配
- 在运行时分配已发布属性的确切时间?
- 运行时间内存分配错误
- C 数组值分配时间
- 堆栈分配的确切时间
- 是否需要解除分配本地时间的内存
- C++在堆上分配相同类型的变量所花费的时间非常不同
- 拆分动态分配的数组,无需线性时间复制
- 在C++中将数据和时间分配给文件时间结构
- 静态成员变量分配时间
- 动态分配 C 字符串内存,无需先询问用户输入时间
- 放置此指针的位置以及为其分配内存的时间
- 如何在C++中检查经过的时间和分配的内存
- 具有c++标准规定的时间复杂度的操作能否动态分配内存?
- 动态内存分配会增加运行时间吗?
- 如何动态分配二维数组一行在一个时间,列是已知的在c/c++
- 在生活游戏中分配迭代时间
- 测量CUDA分配时间