簡體   English   中英

寄存器變量導致執行時間不同,為什么?

[英]Register variables cause execution time to vary, why?

在鬼混時,我發現以下代碼具有恆定的執行時間(我使用 Unix時間命令)為:代碼:

    #define bufferSize 5010
    void seperateDataTo50DigitNumbers(char *buffer){
        unsigned int length = strlen(buffer);
        for (int i = 1; i <= length; ++i){
            printf("%c", buffer[i - 1]);
            if(i%50 == 0){
                printf("\n");
            }
        }
    }
    int main(int argc, char const *argv[])
    {
        char buffer[bufferSize];
        FILE *file;
        file = openFile();
        getAllData(file,buffer);
        seperateDataTo50DigitNumbers(buffer);
        closeFile(file);
        return 0;
    }

時間:

real    0m0.003s
user    0m0.003s
sys     0m0.000s

但我改變了一件小事:

    void seperateDataTo50DigitNumbers(char *buffer){
        register unsigned int length = strlen(buffer);
        for (register int i = 1; i <= length; ++i){
            printf("%c", buffer[i - 1]);
            if(i%50 == 0){
                printf("\n");
            }
        }
    }

我預計代碼會更快,因為變量現在存儲在處理器的寄存器中,但時間會有所不同:

real    0m0.003s
user    0m0.003s
sys     0m0.000s


real    0m0.003s
user    0m0.001s
sys     0m0.003s


real    0m0.004s
user    0m0.001s
sys     0m0.003s

real    0m0.003s
user    0m0.000s
sys     0m0.003s

誰能告訴我這是什么原因? 我們什么時候應該使用寄存器變量來優化代碼?

如果rc是:

#include <stdio.h>
#include <string.h>

void seperateDataTo50DigitNumbersR(char *buffer){
    REGISTER unsigned int length = strlen(buffer);
    for (REGISTER int i = 1; i <= length; ++i){
        printf("%c", buffer[i - 1]);
        if(i%50 == 0){
            printf("\n");
        }
    }
}

我願意 :

pi@raspberrypi:/tmp $ gcc -S -O3 -DREGISTER= r.c -o r.s1
pi@raspberrypi:/tmp $ gcc -S -O3 -DREGISTER=register r.c -o r.s2
pi@raspberrypi:/tmp $ diff r.s1 r.s2
pi@raspberrypi:/tmp $ 

生成代碼完全一樣,我並不感到驚訝

  • 首先編譯器非常好,不需要你的幫助來生成好的代碼
  • 其次,您調用一個函數( printf ),因此除了在寄存器的 CPU 保存頁面上之外,不可能一直在寄存器中使用這些值……在這種情況下,編譯器會自行執行此操作

其中,執行時間太短(部分與寄存器無關,但肯定是printf執行了更多代碼)並且差異並不顯着

暫無
暫無

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

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