繁体   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