簡體   English   中英

哪個更快:靜態數組與非靜態數組?

[英]Which one is faster: static array vs non-static array?

我想知道在 C 中,如果一個函數被大量調用,靜態數組是否比非靜態數組處理得更快。

第一種情況:10 個 int 的非靜態 int 數組:

void useNonStaticIntArray(int i){
    int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    array[i] = i;
}

int main(void){
    int i;
    for (i = 0; i < 1000000000; i++) {
        useNonStaticIntArray(i % 10);
    }
    return 0;
}

第二種情況:10個int的靜態int數組:

void useStaticIntArray(int i){
    static int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    array[i] = i;
}

int main(void){
    int i;
    for (i = 0; i < 1000000000; i++) {
        useStaticIntArray(i % 10);
    }
    return 0;
}

第三種情況:非靜態 int

void nonStaticInt(int i){
    int a;
    a = i;
}


int main(void){
    int i;
    for (i = 0; i < 1000000000; i++) {
        nonStaticInt(i % 10);
    }
    return 0;
}

第四種情況:static int

void staticInt(int i){
    int a;
    a = i;
}


int main(void){
    int i;
    for (i = 0; i < 1000000000; i++) {
        staticInt(i % 10);
    }
    return 0;
}

所以我在 Debian 虛擬機上做了一些測試:

1)

time ./a.out 

real    0m7.733s
user    0m7.696s
sys 0m0.008s

2):

time ./a.out 

real    0m5.477s
user    0m5.416s
sys 0m0.008s

3)

time ./a.out 

real    0m5.764s
user    0m5.736s
sys 0m0.000s

4)

time ./a.out 

real    0m7.189s
user    0m7.016s
sys 0m0.032s

所以看起來靜態比非靜態更快,我測試了幾次以確保並且似乎總是(對於我測試的 10 次)是這種情況。

現在我有 3 個問題: - 我是否做錯了什么從而偽造了結果? (它們正是我所期望的) - 無論數組的大小如何,情況總是如此嗎? (從 1 到 N,N -> 最大堆棧可能值) - 它是如何工作的?

你的測試並沒有真正測量任何東西。

優化編譯器足夠聰明,可以理解代碼什么都不做; 例如gcc將靜態和非靜態版本編譯為空函數(即代碼與{}相同)。

請參閱https://godbolt.org/z/9r8Hxi

另請注意,語義上存在差異(將只有靜態數組的一個實例,在調用之間重復使用,而不是每次調用的非靜態數組都不同)。 這當然意味着非靜態版本需要比靜態版本做更多的工作(即初始化所有元素)......但這將在堆棧中(最有可能在 L1 緩存中),而靜態版本將位於可能在緩存中或可能不依賴於實際使用模式的全局內存中,因此認為非靜態版本在某些情況下實際上可以更快並不荒謬。

但是您需要具有真實數據的真實代碼(並選擇硬件平台)來進行認真的分析……否則,像往常一樣,這取決於。

暫無
暫無

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

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