C 数组值分配时间

c++ array value assignment time

本文关键字:时间 分配 数组      更新时间:2023-10-16

我想知道将值分配为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周期)。