我正在使用
scanf("%d", &someint)
进行大量正整数解析。为了确定scanf是否成为瓶颈,我实现了一个使用fread
的简单整数解析函数,代码如下:int result;
char c;
while (fread(&c, sizeof c, 1, stdin), c == ' ' || c == '\n')
;
result = c - '0';
while (fread(&c, sizeof c, 1, stdin), c >= '0' || c <= '9') {
result *= 10;
result += c - '0';
}
return result;
但是令我惊讶的是,即使进行内联,这个函数的性能也要差约50%。难道没有可能针对特定情况改进scanf吗?fread
不应该很快吗(另一个提示:整数(编辑:大多数情况下)只有1或2位数字)?
c >= '0' && c <= '9'
吗? - Danscanf
的优化可能是由编译器完成的。fread
几乎肯定没有被优化为使用标准输入作为输入。 - Ry-fgetc
函数... - kennytmisdigit()
而不是c>='0' && c<='9'
,因为在某些字符集中数字可能不是连续的,例如 EBCDIC。 - Philip