BusyBoxティーがとても遅い

BusyBoxティーがとても遅い

私はいくつかの古い(Pentium 4)ハードウェアでPuppy-4.3.1 Linuxを使用しています。

私の命令を実行する能力が悪いですtee

このディストリビューションではteeそうですBusyBox v1.15.0

たとえば、このコマンドは以下をtee使用しません。0.05実行には秒がかかります。

cat "$my1megfile" | sha256sum

逆に、teeプロセス置換を使用する場合は、次のものが必要です。15.36数秒で完了、307何倍もかかりました!

cat "$my1megfile" | tee >(sha256sum) >/dev/null

このビルドに問題があるのでしょうかBusyBox、それとも私が間違っているのでしょうか?

teeBashで直接実装できますか?

コマンド(バイナリ)出力を2つの異なるコマンドにパイプする必要があります。その一つはsha256sum

答え1

最近はビジーボックス-1.32、これFEATURE_TEE_USE_BLOCK_IOミニプログラムのパフォーマンスを最適化するために使用される設定パラメータは、次のように設定されますtee「はい」基本的に:

config FEATURE_TEE_USE_BLOCK_IO
bool「バイトI / Oの代わりにブロックI / O(より大きい/高速)を有効にする」
デフォルト値yはTEEヘルプ
によって異なります。サイズを犠牲にしてより速いティーのためにこのオプションを有効にします。

存在するビジーボックス-1.15、同じパラメータが次に設定されます。「いいえ」基本的に。これはtee、システムがゆっくり実行される理由を説明できます。ビジーボックス-1.15

詳細は:

いつFEATURE_TEE_USE_BLOCK_IOはい設定なしtee入力の文字から文字のコピーを作成する(使用getCharacter())を出力に(プーケ()):

    setvbuf(stdout, NULL, _IONBF, 0);
    while ((c = getchar()) != EOF) {
        fp = files;
        do
            putc(c, *fp++);
        while (*fp);
    }

いつFEATURE_TEE_USE_BLOCK_IOはい置くtee代わりにバッファリングされたコピーを使用してください。

    while ((c = safe_read(STDIN_FILENO, buf, sizeof(buf))) > 0) {
        fp = files;
        do
            fwrite(buf, 1, c, *fp++);
        while (*fp);
    }

関連情報