安装 gnomon

又发现一款强大的测量程序的运行时间的工具:gnomon。这个工具软件应该可以运行在 Windows、MacOS 和 Linux 操作系统上。

在 Arch Linux 操作系统上的安装方法:

$ sudo pacman -S npm
$ sudo npm install -g gnomon

官方网站的相关内容

gnomon

Utility to annotate console logging statements with timestamps and find slow processes

A command line utility, a bit like moreutils's ts, to prepend timestamp information to the standard output of another command. Useful for long-running processes where you'd like a historical record of what's taking so long.

Example

测试用例(一)

我在“图灵社区:578. 素数的降幂构成的整数”中提到:

这个程序计算出 C(1013) ≈ 9.2 ×1012,运行时间是 74 秒。

当时是使用 Linux 的 time 命令计时。但是 578.exe 的计算过程分为两个阶段,第一阶段做准备工作,生成素数数组以及计算 π(n) 所需要的数组。第二阶段通过递归计算 C(n)。而使用 gnomon 就可以知道这两个阶段各用了多少时间:

第一阶段用时 32.9 秒,第二阶段用时 41.3 秒,合计用时 74.2 秒。

测试用例(二)

今天上午,卢涛在图灵社区发表了一篇文章:欧拉计划30题(加强版)。我把他的程序稍做修改:

 1: #include <stdio.h>
 2: 
 3: int sum9(int n)
 4: {
 5:   int sum = 0;
 6:   for (; n > 0; n /= 10) {
 7:     int d = n%10, d2 = d*d, d4 = d2*d2;
 8:     sum += d4 * d4 * d;
 9:   }
10:   return sum;
11: }
12: 
13: int main()
14: {
15:   int sum = 0;
16:   printf("Start\n"); fflush(stdout);
17:   for (int i = 2; i <= (int)1e9; i++) {
18:     if (sum9(i) != i) continue;
19:     sum += i;
20:     printf("%d\n", i); fflush(stdout);
21:   }
22:   printf("[%d]\n",sum); fflush(stdout);
23:   return 0;
24: }

运行结果:

  • 使用 5.23 秒找出第一个数(146511208)
  • 使用 12.98 秒找出第二个数(472335975)
  • 使用 2.48 秒找出第三个数(534494836)
  • 使用 15.07 秒找出第四个数(912985153)
  • 使用 3.46 秒完成 for 循环,得到最终结果。

注意,程序必须在一开始就往控制台写一行字,这个程序写的是:Start。这样,gnomon 就会开始不断显示时间,直到找到第一个数,这个 Start 前面的时间就是找到第一个数所用的时间。如果把输出 Start 的语句删除,运行结果如下所示:

gnomon 等待 5.23 秒后,直接从 5.23 秒开始显示,直到 18.21 秒停止显示,然后另起一行,重新开始显示。这个 18.21 秒是找到头两个数的用时合计。

测试用例(三)

在 Linux 操作系统中,gnomon 可以正常显示中文:

参考资料

  1. 图灵社区:测量程序的运行时间(一)
  2. npm: gnomon