-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、フォーマット文字列の解析にもオーバーヘッドがあり、これは少しオーバーヘッドになる可能性があります。

コードの残りの部分は、単純に「数字ではないものはすべてスキップ」し、10 進数を に読み込み、ret数字が非数字のときに停止します。

膨大な数の入力を読み取るには、fread(またはmmapシステムMapViewoOfFileがこれらの呼び出しのいずれかをサポートすることがわかっている場合は)使用してバッファに大量の入力データをロードし、ポインタベースのメソッドを使用して「スキップする」ことをお勧めします数字以外」(これが「安全な」ことであると仮定します)。これは上記のコードよりも高速である可能性が高いです。

于 2013-06-22T14:08:35.610 に答える