簡體   English   中英

值初始化與Calloc對手動初始化速度

[英]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

但是我目前的測試有幾個問題:

  • 我不知道我是否正確隔離了三種不同的初始化方法
  • 我沒有測試所有初始化零數組的方法(memset和malloc,我懷疑它的工作方式類似於calloc)
  • 結果是以秒為單位(ew!),這些都是非常量化的。 (沒有時間?)
  • ARR_SIZ的值不是VS '12(0x7FFFFFFF)允許的最大大小。 我無法將值設置為高於上面代碼中的值,因為我從第一個新調用獲得bad_alloc異常,盡管代碼編譯。
  • 我懷疑通過迭代手動初始化數組的方法比我做的更快

我把上面的一個要點用了斜體,因為我很好奇為什么會這樣。

有沒有人有如何改進我的測試代碼的建議? 或者甚至更好,是否有人能夠直接回答最快的問題?

另外:我關閉了編譯器優化

編輯:我更新了我的代碼以使用clock()。 結果也更新了。

測試不等同,因為使用calloc和可能的值初始化,在觸摸之前實際上並不是0。 而您將malloc內存手動設置為0會導致觸摸並因此分配它。 嘗試讀取值和calloc內存的每個元素(假設優化器不會因為未使用的值而消除讀取),您應該得到相同的結果。

它確實取決於操作系統。 更簡單的操作系統可能不會這樣做。 通常將記憶分為幾頁。 通常,在程序觸摸之前,操作系統實際上不會分配頁面。 它只是“保留”。 這是為了加速程序,這些程序最終不會使用它們分配的所有內存。 如果刪除修改malloc內存的代碼,可能會加快速度。

澄清 - 所有這些都發生在操作系統的幕后。 從值初始化和calloc開始,你的程序可以隨時假設值在0處就緒。

就個人而言,除非是特殊情況,否則我會將vector用於所有動態數組。 它默認將值設置為0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM