[英]Value Initialization vs Calloc vs Manual Initialization Speed
哪个是最快的?
我尝试用这个来测试基本容量中三种方法的速度:
#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;
}
我的结果是:
值初始化持续时间:541
Calloc初始化持续时间:493
手动初始化持续时间:3424
但是我目前的测试有几个问题:
bad_alloc
异常,尽管代码编译。 我把上面的一个要点用了斜体,因为我很好奇为什么会这样。
有没有人有如何改进我的测试代码的建议? 或者甚至更好,是否有人能够直接回答最快的问题?
另外:我关闭了编译器优化
编辑:我更新了我的代码以使用clock()。 结果也更新了。
测试不等同,因为使用calloc和可能的值初始化,在触摸之前实际上并不是0。 而您将malloc内存手动设置为0会导致触摸并因此分配它。 尝试读取值和calloc内存的每个元素(假设优化器不会因为未使用的值而消除读取),您应该得到相同的结果。
它确实取决于操作系统。 更简单的操作系统可能不会这样做。 通常将记忆分为几页。 通常,在程序触摸之前,操作系统实际上不会分配页面。 它只是“保留”。 这是为了加速程序,这些程序最终不会使用它们分配的所有内存。 如果删除修改malloc内存的代码,可能会加快速度。
澄清 - 所有这些都发生在操作系统的幕后。 从值初始化和calloc开始,你的程序可以随时假设值在0处就绪。
就个人而言,除非是特殊情况,否则我会将vector用于所有动态数组。 它默认将值设置为0。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.