颜林林的个人网站

Linlin Yan's Personal Website

快速跟踪程序执行进度

2018-08-05 22:59

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

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

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

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

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

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

$ man pv

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

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