Bash
BusyBox tee 很慢
我在一些較舊的(奔騰 4)硬體上使用 Puppy-4.3.1 Linux。
我在
tee
命令之外的表現很糟糕。在這個發行版上,
tee
是BusyBox v1.15.0
.例如,這個命令沒有執行
tee
需要0.05秒。cat "$my1megfile" | sha256sum
相比之下,如果我使用
tee
with 程序替換,則需要15.36秒才能完成,要長307倍!cat "$my1megfile" | tee >(sha256sum) >/dev/null
這個版本有什麼問題
BusyBox
,還是我做錯了什麼?我可以
tee
在 Bash 中實現我自己的嗎?我需要將命令(二進制)輸出通過管道傳輸到另外兩個命令,其中一個是
sha256sum
.
在最新的busybox-1.32中,優化小程序性能的FEATURE_TEE_USE_BLOCK_IO
tee
配置參數預設設置為**“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); }