這兩周花了些時間做了串流式 JSON 美化程式。基本上是覺得 json_xs / json_pp 都需要等完整份 JSON 檔案讀 入進來才能開始解析。既然上百 MB 的 JSON 檔案已經不那麼罕見了,如果只是想排好看一些或是稍微用肉眼瀏覽 一下其內容結構,全檔解析實在是很浪費記憶體又要等很久。因此,若有個可以立刻有輸出的串流式 JSON 美化程 式,是比較符合實際的。

YAJL Tools 中已經有個 json_reformat 又快又好用。但我還是想試試看用 Perl5 來做可以做到甚麼地步。

我做了兩個版本。json-printjson-print2 。主要的差異在於,json-print 是依照 json.org 上 的規格去寫的,會檢查語法結構,碰到不合格的 JSON 就會停止處理。而 json-print2 則假設輸入是合格的 JSON, 只是在看到特定字符時調整前方的空白、以達到縮排的效果。

以萌典資料中的 dict-reviesd.json (72MB) 來做比較的話。大約是這樣的結果:

  • cat: 0.016s
  • json-print: 51.736s
  • json-print2: 28.667s
  • json_reformat: 0.787s
  • json_pp: 114.98s
  • json_xs: 2.37s

看起來 json-print2 的處理速度約是 json-print 的 1.8 倍。但以整體來說,還是完全比不上 json_xs 的處理 速度。只是不用等個兩、三秒,立刻就會看得到輸出。榜首 json_reformat 就更比不上了。

有空再來仔細推敲一下還有什麼能擠出效能的的地方沒有。