[英]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執行了更多代碼)並且差異並不顯着
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.