gpt4 book ai didi

c++ - 与全局数组相比,为什么在堆中为局部数组分配内存更快?

转载 作者:太空宇宙 更新时间:2023-11-04 16:10:50 25 4
gpt4 key购买 nike

下面是我决定运行的一个简单实验。 test1() 是一个函数,它为全局数组 g 分配内存,然后有一个 for 循环更新这个数组的所有元素。最后,它释放为 g 分配的内存。 test2 中发生了完全相同的事情,但现在我们使用一个名为 l 的本地数组。

#include <iostream>
#define n 1000000000
using namespace std;

int *g;

void test1(){
g = new int[n];
int i;
for(i=0;i<n;i++) g[i] = i;
delete[] g;
}

void test2(){

int *l = new int[n];
int i;
for(i=0;i<n;i++) l[i] = i;
delete[] l;
}
int main()
{

timespec cpu_time_s;
timespec cpu_time_e;

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cpu_time_s);
test1();
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cpu_time_e);
long long int ns = (cpu_time_e.tv_sec * 1000000000
+ cpu_time_e.tv_nsec - (cpu_time_s.tv_sec * 1000000000
+ cpu_time_s.tv_nsec));
cout<<ns<<" ns"<<endl;

clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cpu_time_s);
test2();
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cpu_time_e);
ns = (cpu_time_e.tv_sec * 1000000000
+ cpu_time_e.tv_nsec - (cpu_time_s.tv_sec * 1000000000
+ cpu_time_s.tv_nsec));
cout<<ns<<" ns"<<endl;

return 0;
}

我运行了一些测试,test1() 达到了 2709066246 nstest2 达到了 2459390299 ns

最佳答案

由于第一个测试运行速度较慢,无论是哪个,那么操作系统可能需要更长的时间来分配 4GB,然后在第一次通过时将其映射到可写内存。在极端情况下,它可能需要将其他内容保存到交换文件中以使 RAM 第一次可用,但第二次则不然。在轻负载下,您希望这不是必需的,但操作系统可能仍然需要做一些事情,例如删除磁盘缓存并重新使用它之前占用的内存。这是快速但不是即时的。

在第二遍中,您刚刚释放了 4GB 的内存,所有这些内存都是最近映射的,因此要做的工作可能会少一些。释放的 4GB 甚至可能仍与您的进程相关联,因此操作系统根本无事可做,尽管您不希望有这么大的 block 。

您可以通过运行 test2 两次来检查,并查看第一次是否始终较慢。如果它通常是这样的,那么它与分配和写入数组有关,而不是与您如何做的细节有关。

如果全局无论顺序如何都变慢,那么我能想到的最明显的可能原因是编译器可能不会将 g 保存在寄存器中,而是可能会重复将其加载出全局区域。您可以通过查看它发出的代码来检查这一点。

关于c++ - 与全局数组相比,为什么在堆中为局部数组分配内存更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28876422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com