有人可以解释这个快速输入背后的逻辑吗?我知道它比scanf快。快速输入后面的逻辑
int scan()
{
int ip=getchar_unlocked(),ret=0;
for(;ip<'0'||ip>'9';ip=getchar_unlocked());
for(;ip>='0'&&ip<='9';ip=getchar_unlocked())
ret=ret*10+ip-'0';
return ret;
}
有人可以解释这个快速输入背后的逻辑吗?我知道它比scanf快。快速输入后面的逻辑
int scan()
{
int ip=getchar_unlocked(),ret=0;
for(;ip<'0'||ip>'9';ip=getchar_unlocked());
for(;ip>='0'&&ip<='9';ip=getchar_unlocked())
ret=ret*10+ip-'0';
return ret;
}
这里的unlocked
部分是为了避免锁定所述输入文件(从而潜在地引起问题,如果多个线程从相同的输入读数)。
与其他使用getchar
的收益相比,这可能是90%的收益,而这反过来可能只会略微好于scanf
。很明显,scanf
在解析格式字符串时也有开销,这可能会带来一些开销。
其余代码只是“跳过不是数字的任何东西”,然后将一个十进制数字读入ret
,当数字是非数字时停止。
为了读取的输入广大,I(如果系统是已知的,以支持那些呼叫中的一个或mmap
或MapViewoOfFile
)加载了大量的输入数据在缓冲器中会建议使用fread
,然后用一基于指针的方法来“跳过非数字”(假设这是一个“安全”的事情)。很有可能这比上面的代码更快。
是啊// @Mats Petersson..Thanx的回复 – JayPatel
你不了解什么? –
明白了Vaughn Cato !! Thanx .. – JayPatel