寄存器变量导致执行时间变化,为什么?

问题描述 投票:-3回答:1

我在64位机器上使用GCC编译器。在愚弄我发现以下代码有一个恒定的执行时间(我使用Unix时间命令)为:代码:

#include<stdio.h>
#include <string.h>
#include<stdlib.h>
#define bufferSize 5010
#define numberOfElements 100
#define sizeOfEachNumber 50
FILE* openFile(){
    return fopen("file.txt","r");
}
int closeFile(FILE* file){
    return fclose(file);
}
char* getAllData(FILE* file,char* buffer){
    fgets(buffer,bufferSize,file);
    return buffer;
}
void showData(char *buffer){
    printf("The data in the buffer is:%s\n", buffer);
}
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

但我换了一个小东西,就是函数seperateDataTo50DigitNumbers:

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.001s


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


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

令人惊讶的是,寄存器变量会对程序产生如此大的影响,任何人都可以告诉我这个原因。我们什么时候应该使用寄存器变量来优化代码。

c 64bit processor
1个回答
1
投票

如果r.c是:

#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执行更多代码)并且差异不显着

© www.soinside.com 2019 - 2024. All rights reserved.