読者です 読者をやめる 読者になる 読者になる

amori's blog

よろず技術系と趣味関係の雑記です

とすなで!(その4)

女子大生と(以下省略)

の続き

というわけで標準入出力をいじってみる。

前回の経験では0.09秒ぐらいからscanf(),printf()のオーバヘッドが無視できなかった。

 

まずscanf()を全部getchar()で整数読み込みに特化して書きか直してみたら、0.01秒づつ速くなった。やっぱりかwww 

まあ、前回は0.04秒ほども違ってたから今回はさすがにちょっとその辺は考慮したのかもしれない。

SSS判定はかわらず内容も同じなので画像ペースト省略。

amoriさんの採点結果[100点] マジ、神!見直しちゃった。。|paizaオンラインハッカソンVol.2

では次にprintf()もputchar()に置き換えてみる。テストケース6はやっぱり0.01秒早くなった。ケース7は0.02秒だったり0.03秒だったりするので微妙なとこだが、少なくとも有意に効果があるようだ。

amoriさんの採点結果[100点] マジ、神!見直しちゃった。。|paizaオンラインハッカソンVol.2

以下お手製scanとprintのコード。(scan_intはEOFがこないことを前提として条件分岐を減らした危険なコードなのでご注意を)

int scan_int(void)
{
    int c,num;
    //数字までスキップ
    num = 0;
    while (1){
        c=getchar();
        num += c2i[c];
        if ( num ){
            num--;
            break;
        }
    }
    //数字が終わるまで桁ごとに加算
    while (1){
        c=getchar();       
        if(!c2i[c]) return num;
        num = num*10 + c - '0';
    }
}

void output_int( int num )
{
    int n;
    n=num/10;
    if( n ) output_int( n );
    putchar(num%10 + '0');
}

関数の再起呼び出しではないパターンも試してみたけど、結果は変わらなかったので簡潔なこっちを残しておこう。

あとやることは、getcharの逐次呼び出しじゃなくって標準入力を一気に読み込んでしまうパターンくらいかなー。

追記:fread()でまるごと標準入力を読み込むってのを試してみたが計測できるほどの差はなかった。getcharは(たぶんgetcも)マクロだからたいして差はないみたいだ。

あと0.01秒とはいってもここまでくると倍にしなきゃならん。まだどっか工夫できるかな