測量程式的執行時間(二)

黃志斌發表於2016-11-27

安裝 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

相關文章