Я использую компилятор 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
Действительно удивительно, что переменные регистра могут так сильно повлиять на программу, кто-нибудь может сказать мне причину этого. И когда мы должны использовать переменные регистра для оптимизации кода.