-3

有人能解释一下这个快速输入背后的逻辑吗?我知道它比 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;
}
4

1 回答 1

3

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

与其他使用 相比,这可能是 90% 的收益所在,getchar而这可能仅略好于scanf。显然,scanf解析格式字符串也有开销,这可能有点开销。

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

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

于 2013-06-22T14:08:35.610 回答