[英]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.