Переменные регистра вызывают изменение времени выполнения, почему? - PullRequest
0 голосов
/ 16 марта 2019

Я использую компилятор GCC на 64-битной машине. Дурачясь, я обнаружил, что следующий код имеет постоянное время выполнения (я использовал команду времени 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");
        }
    }
}

Я ожидал, что код будет быстрее, поскольку переменные теперь хранятся в регистре процессора, но вместо этого я получаю различное время (иногда даже больше, чем первый код): TIMES:

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

Действительно удивительно, что переменные регистра могут так сильно повлиять на программу, кто-нибудь может сказать мне причину этого. И когда мы должны использовать переменные регистра для оптимизации кода.

1 Ответ

1 голос
/ 16 марта 2019

, если 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 ), поэтому невозможно постоянно сохранять значения в регистрах, кроме как на странице сохранения регистров процессора ... и в этом случае компилятор делает это сам

Из-за этого время выполнения слишком мало (и не выполняется частично в связи с регистрами, но, безусловно, printf выполняет больше кода), и различия незначительны

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...