如果您不知道 Pipe Viewer 是什么(我直到 5 分钟前才知道),那么 这个博客 很好地通过一些示例对其进行了简要介绍。作为一名 ETL 开发人员,我编写了很多 Perl 脚本,很多时候,我使用的文件需要很长时间才能操作(解压缩、移动等)。因此,除了我在 Windows 环境中工作之外,这个工具会很棒。如果有人知道有一个工具可以为您提供管道中运行的操作的进度,请告诉我,因为这将使我的脚本更加有用。
我终于让它在 Cygwin 环境中工作,尽管这不是原始帖子的答案。
--disable-nls
就可以了。
./configure --disable-nls
make
make test
cp pv /usr/bin
== Kenji (k2) ==
我怀疑win32上是否存在这样的工具,但它应该在cygwin上运行。但话又说回来,你可能不会使用它:)
我怀疑您想使用管道查看器来捕获控制台应用程序的输出性能(字节/秒)。
如果你想测量进程的IO读/写性能,我建议使用Process Explorer。您可以找到每个进程的性能。
请参阅 https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer
我为 Windows 创建了一个名为“PipeViewer”的新实用程序。
它是开源的,它列出了所有当前的命名管道并向您显示每个命名管道的所有详细信息。
将来我们可能会添加一个监视器来实时检查新的命名管道。
许多网站上的许多答案都建议使用 cygwin 中的 pv 包。但
pv.exe
取决于 cygwin1.dll
,您需要与可执行文件一起复制的附加 dll 文件。
我最终自己使用 Go 创建了一个简单的
pv
克隆。
package main
import (
"fmt"
"io"
"os"
"sync"
"time"
)
func main() {
// Create a buffer to read data
buffer := make([]byte, 32768)
var totalBytes float64 = 0
// Channel to signal when to update progress
progressTicker := time.NewTicker(1500 * time.Millisecond)
defer progressTicker.Stop()
var wg sync.WaitGroup
wg.Add(1)
// Channel to signal when reading is finished
done := make(chan struct{})
// Start a goroutine to handle progress display
go func() {
defer wg.Done()
var MB float64 = 1024 * 1024
var totalMB float64
var lastBytes float64
var speed float64
var elapsed float64
startTime := time.Now()
for {
select {
case <-progressTicker.C:
elapsed = time.Since(startTime).Seconds()
if elapsed > 0 {
speed = (totalBytes - lastBytes) / MB / elapsed
totalMB = totalBytes / MB
fmt.Fprintf(os.Stderr, "\r%8.1f MB, %6.2f MB/s", totalMB, speed)
lastBytes = totalBytes
startTime = time.Now()
}
case <-done:
totalMB = totalBytes / MB
fmt.Fprintf(os.Stderr, "\r%8.1f MB\n", totalMB)
return
}
}
}()
// Read from stdin and write to stdout
for {
n, err := os.Stdin.Read(buffer)
if err != nil && err != io.EOF {
fmt.Fprintf(os.Stderr, "Error reading from stdin: %v\n", err)
break
}
if n == 0 {
break
}
// Write to stdout
if _, err := os.Stdout.Write(buffer[:n]); err != nil {
fmt.Fprintf(os.Stderr, "Error writing to stdout: %v\n", err)
break
}
// Update total bytes processed
totalBytes += float64(n)
}
// Signal that reading is done
done <- struct{}{}
wg.Wait()
}
它的基本功能与
pv
类似,虽然不如pv
那么全面,但至少它完成了工作。它从stdin
读取数据并将其发送到stdout
,同时将总兆字节和速度写入stderr
。