快速输入背后的逻辑

Logic behind Fast input

本文关键字:背后 输入      更新时间:2023-10-16

谁能解释一下这种快速输入背后的逻辑?我知道它比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,当该数字是非数字时停止。

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