程式碼統計工具 - tokei

🕓2017年07月25日 · ☕4 分鐘 · 👀... 閱讀

一般開發者或許沒有程式碼統計的習慣, 在開發過程中, 我們可能很少注意整個 Project 的程式碼行數. (反正能跑就好😂)

但當遇到要部署, 團隊合作互相檢視進度, 又或者有軟體法律問題發生時, 程式碼統計就很重要了.

而且養成習慣後, 就不會容許有一個人豪邁地寫幾萬行 Javascript 這種事情發生. 😄😄


wc

IDE (VS, Xcode, Eclipse) 可能會有內建的統計 plugin 來瞭解專案的開發進度,

而在 terminal 下, 用家可以很簡單地用 wc (word count) 算目前目錄底下檔案的行數, 比如:

$ wc -l ./*

不過這只能看一個目錄下的檔案, 當然我們可以搭配其他 command 用 pipe 做一個更好的工具出來, 但其實已經有人做出很好的 OpenSource 工具了 😄


Cloc 簡介:

以前我會使用一個叫 Cloc 的工具,
它是一款用 Perl 實作的工具, 安裝十分方便 (實際上只是一支 Perl script), 能識別和支援的語言種類很多, 而且能跨平台使用 (Perl).

以這個的 Blog 的程式碼為例:

      71 text files.                      
      71 unique files.                                                               
       9 files ignored.                   

github.com/AlDanial/cloc v 1.72  T=0.16 s (389.0 files/s, 38917.5 lines/s)           
-------------------------------------------------------------------------------      
Language                     files          blank        comment           code      
-------------------------------------------------------------------------------      
JavaScript                       6            599            230           1702      
CSS                              7            182            240           1451      
HTML                            38            142            241            930      
Markdown                         8            153              0            286      
YAML                             4             16             16            115      
-------------------------------------------------------------------------------      
SUM:                            63           1092            727           4484      
------------------------------------------------------------------------------- 

Cloc 預設會遍歷每個子目錄, 識別所有的檔案, 把其中的 blank, comment, code lines 都按欄位印出來, 而三個欄位加起來就是總行數.

Cloc 還支援其他很多功能, 包括排除指令, 多種輸出格式 (XML, YAML …) 等, 應該已經符合平常使用的要求.


不過 Cloc 始終是一支 Perl script.

這邊以我 2017 的工作目錄來做統計, 再用 time 算時間:

$ time cloc ~/workspace
.....                                                                         
---------------------------------------------------------------------------------------                                                                                   
SUM:                                 28819        1339834        1593955        6908299                                                                                   
---------------------------------------------------------------------------------------                                                                                   
cloc ~/workspace  76.23s user 15.58s system 73% cpu 2:04.80 total                    

共花了 2 分鐘的時間, 在數量級為百萬行的目錄下, Cloc 花費的時間要以分鐘為單位.


tokei 簡介:

Linux 使用的 package mangemant system 會有類似 software 的推薦,

於是我便偶然間發現了 tokei 這個工具. 😄

安裝 tokei

目前 tokei 還沒有支援很多的平台直接安裝,

  • Archlinux 和 Fedora 用戶可以直接安裝:
1
2
3
4
5
6
# Arch
$ pacman -S tokei

# Fedora
$ dnf copr enable phnxrbrn/tokei
$ dnf install tokei

不過最推薦的做法是使用 Cargo 來自行建置, 利用 Rust 跨平台的特性, tokei 也能很簡單安裝在 Windows, macOS 上.

# Build directly.
$ cargo install tokei
# Or clone From github.
$ git clone https://github.com/Aaronepower/tokei.git
$ cd tokei
$ cargo build --release

# sudo mv target/release/tokei /usr/local/bin

使用 tokei

tokei 的功能和 Cloc 其實大同小異:

再以這個 Blog 為例:

-------------------------------------------------------------------------------
 Language            Files        Lines         Code     Comments       Blanks
-------------------------------------------------------------------------------
 CSS                     7         1873         1451          240          182
 HTML                   38         1313          672          499          142
 JavaScript              6         2531         1744          188          599
 Markdown                8          456          456            0            0
 TOML                    3          210          151           28           31
 YAML                    3          118           92           14           12
-------------------------------------------------------------------------------
 Total                  65         6501         4566          969          966
-------------------------------------------------------------------------------

tokei 默認印出現行目錄下 Lines (總行數), Code, Comment, Blanks 的欄位, 就輸出介面訊息來說比 Cloc 更友善一點,

如果你要忽略某種檔案類型, 你可以用 –execulde flag.
比如我專案下有很多類型的檔案, 想要去掉所有的 HTML.

$ tokei . --exclude *.html

這樣子就可以自訂想要統計要那幾種檔案的類型, 方便之後統整, 繪圖使用.

tokei 加上 –files flags 後就可以印出所有目錄下的檔案及其名稱.

$ tokei . --files

也可以加上 -v (verbose) flag, 看 error 和 warning:

$ tokei . -v

詳細用法可以看 –help

$ tokei --help

tokei 雖然和 Cloc 功能上有重疊, 但 tokei 最大的優勢是用 Rust 實作, 單一執行檔的效能比 Cloc 要快上幾倍.

舉例以我 2017 的工作目錄來做統計:

$ time tokei ~/workspace
.....
-------------------------------------------------------------------------------
 Total               29214      9770495      7220769      1244609      1305117
-------------------------------------------------------------------------------
tokei ~/workspace  7.28s user 0.36s system 98% cpu 2.397 total

雖然 CPU 使用率變高, 但約 9 百萬行的專案, 只花了約 2s 多的時間, 效能上差距很大 !!


總結:

tokei 目前功能比較少 (少了檔案 diff etc.) 和安裝 (依賴 Rust) 上比較麻煩.

如果你會使用 Rust 和 Cargo, 那安裝上並沒有很大的問題.

而細心的讀者到這里一定發現, 為什麼 Cloctokei 出來的結果並不相同 😂

依照它們 document 的說法, Cloc 支援的檔案類型比 tokei 要多 100 種左右.

可是 tokei 有支援一些新的檔案類型, 比如 .toml, .txt 等 plain text 檔.

雖然兩個工具計算出的總行數的數量級是一樣的, 但使用時一定要注意各自支援的檔案類型 !!

Cloc 有 –include-lang= 這個 flag.

tokei 則可以自行寫一支 script, 來截取想要的檔案類型結果.

比如可以自行用 grep 來取得想要的類型行數,

$ tokei . | grep "HTML" | awk ...

注意事項:

  • 目前 tokei 還是一個很新的工具, 潛在的 bug 也不少, 比如之前有 ruby 特有的注解(=begin =end) 統計錯誤等問題.
  • 個人測試過, 目前 C/C++, Java, Javascript, Rust, Markdown, CSS, JSON, cmake 等檔案, 結果準確度沒有問題.
  • 如果你十分註重統計數據的準確度, 而且不在意效能和時間, 想用來建報表, 那麼 Cloc 可能比較合適.
  • 但如果你只是要大概了解專案現在的程式碼數據, 團隊討論用, 那會建議你用 tokei 快速得出結果. 😄
  • 此外, 同類型的工具其實不少, 還有同樣用 Rust 做的, 聲稱最快的 loc, 有興趣可以去試用 😂😂

Reference:

  • Cargo
  • 這不是 Rust 推介文 😂😂

si1kdd
作者
si1kdd
Yet another muggle who still programming