值初始化vs Calloc vs手动初始化速度
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: %dn", val_init_dur);
printf("Calloc Initialization Duration: %dn", calloc_dur);
printf("Manual Initialization Duration: %dn", manual_dur);
fgetc(stdin);
return 0;
}
我的结果是:
初始化时间:541
callloc Initialization Duration: 493
手动初始化时长:3424
但是我现在的测试有几个问题:
- 我不知道我是否正确地隔离了三种不同的初始化方法
- 我没有测试所有初始化零数组的方法(memset和malloc,我怀疑它们的工作方式类似于calloc)
结果以秒为单位(ew!),这是可怕的量子化。(没有ms time?)- arr_size的值不是VS '12 (0x7FFFFFFF)允许的最大大小。我无法设置任何高于上面代码中的值,因为我从第一个新调用中获得
bad_alloc
异常,尽管代码编译。 - 我怀疑有一种通过迭代手动初始化数组的方法比我做的更快
我把上面的一个要点斜体了,因为我很好奇为什么会这样。
有没有人有建议如何改进我的测试代码?或者更好的是,有人能直接回答最初的问题,哪个最快吗?
还有:我已经关闭了编译器优化
编辑:我更新了我的代码使用时钟()。结果也更新了
这两个测试是不相等的,因为使用calloc和可能的值初始化,实际上并没有将内存置零,直到它被触摸。而您手动将malloc'd内存设置为0会导致它被触摸并因此被分配。尝试读取值的每个元素并调用内存(假设优化器不会因为值未使用而消除读取),您应该得到相同的结果。
这取决于操作系统。一个简单的操作系统可能不会这样做。记忆通常被分成几页。通常,一个页面在被程序接触之前不会被操作系统实际分配。它只是"保留"。这是为了加快程序的速度,而不是最终使用它们分配的所有内存。如果你删除修改malloc内存的代码,也许它会加快速度。
澄清一下——所有这些都是由操作系统在幕后完成的。您的程序完全可以假设值在任何时候都是0,从值初始化和调用开始。
除非特殊情况,否则我个人会对所有动态数组使用vector。默认情况下,它将值设置为0。
相关文章:
- 使用双大括号的矢量初始化:std::string vs int
- 如何初始化boost :: edge_weight_t类型在vs vs c 上
- C 模板类,初始化()vs {}
- 在类嵌套静态常量成员变量初始化 Clang vs GCC 哪个编译器是正确的
- 为什么VS编译器不会在C++上自动初始化局部变量?
- 'for' 循环中的 'int i = 0' vs. 'int i(0)'(赋值与初始化计数变量)
- 在VS 2013中使用初始值设定项列表初始化地图的地图
- 使用const初始化constexpr,--int vs float
- 在使用auto时初始化结构会导致VS 2013中的副本
- std::shared_ptr 初始化:make_shared<Foo>() vs shared_ptr<T>(new Foo)
- 线程安全惰性初始化:静态vs std::call_once vs双重检查锁定
- 无法初始化Direct3D VS 2015(Win 10)
- 使用 VS 2012 在构造函数中的树节点中初始化数组
- 直接初始化字段vs默认构造函数中的初始化列表
- 默认初始化vs.值初始化
- 值初始化vs Calloc vs手动初始化速度
- 构造函数初始化列表vs昂贵操作
- ' auto x = type{…} '初始化语法和'显式'转换操作符- clang vs gcc
- 值初始化vs聚合初始化
- 大括号初始化vs.括号错误