gpt4 book ai didi

c++ - 值初始化 vs Calloc vs 手动初始化速度

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:00 25 4
gpt4 key购买 nike

哪个最快?

我尝试用这个基本容量测试三种方法的速度:

#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "time.h"

int _tmain(int argc, _TCHAR* argv[])
{
const unsigned long long ARR_SIZ = 0x4fffffff;
clock_t val_init_dur, calloc_dur, manual_dur;
clock_t cur = clock();
char* val_init = new char[ARR_SIZ]();
clock_t after = clock();
val_init_dur = after-cur;
delete[] val_init;

cur = clock();
void* calloc_init = calloc(ARR_SIZ, sizeof(char));
after = clock();
calloc_dur = after-cur;
free(calloc_init);

cur = clock();
char* manual_init = new char[ARR_SIZ];
for (unsigned long i=0; i < ARR_SIZ; i++)
manual_init[i] = 0;
after = clock();
manual_dur = after-cur;
delete[] manual_init;

printf("Value Initialization Duration: %d\n", val_init_dur);
printf("Calloc Initialization Duration: %d\n", calloc_dur);
printf("Manual Initialization Duration: %d\n", manual_dur);
fgetc(stdin);
return 0;
}

我的结果是:

Value Initialization Duration: 541

Calloc Initialization Duration: 493

Manual Initialization Duration: 3424

但是我当前的测试有几个问题:

  • 我不知道我是否正确地隔离了三种不同的初始化方法
  • 我没有测试所有初始化零数组的方法(memset 和 malloc,我怀疑它们像 calloc 一样工作)
  • 结果以秒为单位(哇!),量化得非常可怕。 (没有毫秒时间?)
  • ARR_SIZ 的值不是 VS '12 (0x7FFFFFFF) 允许的最大大小。我无法将值设置为高于上面代码中的值,因为我从第一个新调用中得到了 bad_alloc 异常,尽管代码正在编译。
  • 我怀疑有一种通过迭代手动初始化数组的方法比我的方法更快

我用斜体标出了上面的一个要点,因为我很好奇为什么会这样。

有没有人建议如何改进我的测试代码?甚至更好的是,对于哪个最快的初始问题,有人可以直接回答吗?

另外:我关闭了编译器优化

编辑:我更新了我的代码以使用 clock()。结果也更新了。

最佳答案

测试不等价,因为使用 calloc 和可能的值初始化,实际上并没有将内存清零,直到它被触及。而您将 malloc 的内存手动设置为 0 会导致它被触及并因此被分配。尝试读取值的每个元素和调用的内存(假设优化器不会因为未使用值而消除读取)你应该得到相同的结果。

它确实取决于操作系统。一个更简单的操作系统可能不会这样做。通常内存被分成页面。通常,一个页面在被程序触及之前实际上并没有被操作系统分配。它只是“保留”。这是为了加速不会最终使用它们分配的所有内存的程序。如果删除修改 malloc 内存的代码,也许它会加速。

澄清一下——所有这一切都发生在操作系统的幕后。您的程序完全可以假设从值初始化和 calloc 开始,值随时准备好为 0。

除非特殊情况,否则我个人会为所有动态数组使用 vector 。默认情况下,它将值设置为 0。

关于c++ - 值初始化 vs Calloc vs 手动初始化速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24936187/

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