2014-07-24 112 views
4

哪一個是最快的?值初始值vs Calloc vs手動初始化速度

我試圖測試的基本能力與這三種方法的速度:

#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!)爲單位的,它們被嚴重量化。 (無ms時間?)
  • ARR_SIZ的值不是VS '12(0x7FFFFFFF)允許的最大大小。我無法將該值設置爲高於上面代碼中的值,因爲儘管編譯了代碼,我仍然從第一次新調用中獲得了bad_alloc例外。
  • 我懷疑有手動初始化通過反覆比我做到了

我斜體字上面的要點之一,因爲我很好奇,爲什麼是這樣一個數組更快的方法。

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

另外:我已經關閉的編譯器優化

編輯:我更新了我的代碼,使用時鐘()。結果也更新了。

+1

這些測試並不等同,因爲使用calloc和可能的值初始化,直到它被觸摸時纔會實際記憶0內存。而你手動將malloc'd內存設置爲0會導致它被觸及並因此分配。嘗試讀取值和calloc'd內存的每個元素,並且(假設優化器不會消除讀取,因爲值沒有使用),您應該得到相同的結果。 –

+0

不要使用'time()'來進行這種測量。使用'clock()'或甚至更好''設施。 –

+0

這是否在元素的基礎上工作?就像我訪問單個數組元素只有那個單個元素init'd爲0一樣?或者當一個元素被訪問時整個數組是被初始化的? – SyntaxTerror

回答

2

這些測試並不等同,因爲使用calloc和可能的值初始化,直到它被觸摸時纔會實際記憶0內存。而你手動將malloc'd內存設置爲0會導致它被觸及並因此分配。嘗試讀取值和calloc'd內存的每個元素,並且(假設優化器不會消除讀取,因爲值沒有使用),您應該得到相同的結果。

它的確取決於操作系統。更簡單的操作系統可能不這樣做。內存通常分爲多頁。通常,一個頁面實際上並沒有被OS分配,直到它被程序觸摸。它只是「保留」。這是爲了加速程序,最終不會使用它們分配的所有內存。如果你刪除修改malloc的內存的代碼,它可能會加快速度。

澄清 - 所有這些都發生在操作系統的幕後。你的程序完全可以假定值已經準備好在0的時候,從值初始化和calloc。

就個人而言,我會使用矢量爲所有動態數組,除非特殊情況。它會默認將值設置爲0。