在编程处理数据量较大的文件时,时常会需要跟踪程序的执行进度,确认其速度能达到预期,不至于需要花费的时间长到完全无法接受。

过去,我通常的做法,会在循环体中手工加入一些print命令,类似:

cpp
 1time_t t0 = time(NULL);
 2size_t count = 0;
 3while (readline(line)) {  // 每次读取一行
 4    ++count;
 5    ...
 6    process(line);        // 处理该行
 7    ...
 8    time_t now = time(NULL);
 9    if (now >= t0 + N) {  // 每隔N秒打印一次信息
10        printf("time = %u, count = %u\n", time, count);
11        t0 = now;
12    }
13}

今天,新学习到一个好用的命令:pv,能够快速在命令行就实现此追踪功能:

text
1$ cat input.txt | pv -l | process > output.txt

这里,-l参数是让pv按照行计数,缺省是按照字节计数的。更多参数及用法,可以参见其帮助文档:

text
1$ man pv

Linux命令行的组合是异常强大的,借此,我们甚至可以动态追踪某个命令执行特定系统函数的累计次数:

text
1$ strace ./a.out 2>&1 | grep read | pv -l | wc -l  # 累计调用read函数的次数