快速输入背后的逻辑

时间:2013-06-22 13:59:05

标签: c++ input

有人可以解释这种快速输入背后的逻辑吗?我知道它比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;
}

1 个答案:

答案 0 :(得分:3)

这里的unlocked部分是为了避免锁定输入文件(因此如果多个线程从同一输入读取,可能会导致问题)。

与使用getchar的其他人相比,这可能是90%的收益,而这反过来可能只比scanf稍微好一些。显然,scanf在解析格式字符串时也有开销,这可能有点开销。

其余代码只是“跳过任何不是数字的东西”,然后将十进制数读入ret,当数字为非数字时停止。

对于阅读大量输入,我建议使用fread(或mmapMapViewoOfFile(如果已知系统支持其中一个调用)加载大量缓冲区中的输入数据,然后使用基于指针的方法“跳过非数字”(假设这是一个“安全”的事情)。很可能这比上面的代码更快。