Bash

BusyBox tee 很慢

  • December 8, 2020

我在一些較舊的(奔騰 4)硬體上使用 Puppy-4.3.1 Linux。

我在tee命令之外的表現很糟糕。

在這個發行版上,teeBusyBox v1.15.0.

例如,這個命令沒有執行tee需要0.05秒。

cat "$my1megfile" | sha256sum

相比之下,如果我使用teewith 程序替換,則需要15.36秒才能完成,要長307倍!

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

這個版本有什麼問題BusyBox,還是我做錯了什麼?

我可以tee在 Bash 中實現我自己的嗎?

我需要將命令(二進制)輸出通過管道傳輸到另外兩個命令,其中一個是sha256sum.

在最新的busybox-1.32中,優化小程序性能的FEATURE_TEE_USE_BLOCK_IOtee配置參數預設設置為**“yes”**:

config FEATURE_TEE_USE_BLOCK_IO

bool “啟用塊 I/O(更大/更快)而不是字節 I/O”

預設 y

取決於 TEE

幫助

啟用此選項以獲得更快的 tee,但會犧牲大小。

busybox-1.15中,相同的參數預設設置為**“no”。這可以解釋為什麼tee您的系統執行busybox-1.15**很慢。

更多細節:

FEATURE_TEE_USE_BLOCK_IO設置時,將其輸入(使用getchar()tee )逐字元複製到其輸出(使用putc()):

   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);
   }

引用自:https://unix.stackexchange.com/questions/623191