![BusyBox tee 非常慢](https://linux22.com/image/184602/BusyBox%20tee%20%E9%9D%9E%E5%B8%B8%E6%85%A2.png)
我在一些较旧的(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
,还是我做错了什么?
tee
我可以在 Bash 中实现我自己的吗?
我需要将命令(二进制)输出通过管道传输到其他两个命令,其中之一是sha256sum
.
答案1
在最新的busybox-1.32, 这FEATURE_TEE_USE_BLOCK_IO用于优化小程序性能的配置参数设置tee
为“是的”默认情况下:
config FEATURE_TEE_USE_BLOCK_IO
bool “启用块 I/O(更大/更快)而不是字节 I/O”
默认 y
取决于 TEE
帮助
启用此选项以获得更快的 Tee,但会牺牲大小。
在busybox-1.15,同样的参数设置为“不”默认情况下。这可以解释为什么tee
你的系统运行缓慢busybox-1.15。
更多细节:
什么时候FEATURE_TEE_USE_BLOCK_IO是没有设置,tee
对其输入进行逐字符复制(使用获取字符())到其输出(与普特克()):
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);
}