值初始化与Calloc对手动初始化速度

时间:2014-07-24 14:15:45

标签: c++ c performance

哪个最快?

我尝试用以下方法测试基本容量中三种方法的速度:

#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

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

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

我将上面的一个要点用斜体显示,因为我很好奇为什么会这样。

有人有建议如何改进我的测试代码吗?或者甚至更好,是否有人能够直接回答最快的问题?

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

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

1 个答案:

答案 0 :(得分:2)

测试不等同,因为使用calloc并且可能是值初始化,在触摸之前实际上并不是0。而您将malloc内存手动设置为0会导致触摸并因此分配它。尝试阅读值的每个元素和calloc内存(假设优化器不会因为未使用的值而消除读取),您应该得到相同的结果。

这取决于操作系统。更简单的操作系统可能不会这样做。通常将记忆分为几页。通常,在程序触摸之前,操作系统实际上不会分配页面。它只是&#34;保留&#34;。这是为了加快程序,这些程序最终不会使用它们分配的所有内存。如果删除修改malloc内存的代码,可能会加快。

澄清 - 所有这些都发生在操作系统的幕后。从值初始化和calloc开始,你的程序可以随时假设值在0处就绪。

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