printfはやくなるか

なんか色々と検討した結果、画像処理ライブラリに必要なのは高速なprintfという結論に至った我々はprintfはやくしようと思った。


WriteFile
https://skydrive.live.com/redir?resid=ECB59E566C2D71F1!2671&authkey=!AJpqfR-j8rl6w18

コードはこれ
https://gist.github.com/tanakamura/7295694


まあ大体 1e-9 〜 1e-8 [sec/byte] ぐらい出ると思ってよさげ。省電力機能のケアとかはしてないのであまりいい値ではない。

というかWindowsの境界2560なんだこれ。

Linux揺れてるのはVirtualBOX上だからかな…まあそのうち確認しよう。


printf
https://gist.github.com/tanakamura/7295977

  • fprintf : これをはかりたい
  • sprintf : IOのオーバーヘッド除いた
  • fputs : printfとIOのオーバーヘッド比べるために入れた
  • digit : 関数呼び出しのオーバーヘッドとりたい(GCCでは-fno-builtin付けてる)
mac:
     fputs: 640 480 0 9.772301e-02[sec] 1.871228e-08[sec/byte]
   sprintf: 640 480 0 2.412901e-01[sec] 4.463046e-08[sec/byte]
   fprintf: 640 480 0 2.970252e-01[sec] 5.493955e-08[sec/byte]
     digit: 640 480 0 4.692078e-04[sec] inf[sec/byte]

win-vc2012
     fputs: 640 480 0 5.463843e-002[sec] 1.046232e-008[sec/byte]
   sprintf: 640 480 0 1.332914e-001[sec] 2.465437e-008[sec/byte]
   fprintf: 640 480 0 1.681525e-001[sec] 3.110249e-008[sec/byte]
     digit: 640 480 0 6.316458e-004[sec] 1.#INF00e+000[sec/byte]

linux-glibc:
     fputs: 640 480 0 3.984094e-02[sec] 7.628856e-09[sec/byte]
   sprintf: 640 480 0 6.200790e-02[sec] 1.146935e-08[sec/byte]
   fprintf: 640 480 0 5.031013e-02[sec] 9.305663e-09[sec/byte]
     digit: 640 480 0 1.144886e-03[sec] inf[sec/byte]


ふつうにprintfでも1e-8[sec/byte]ぐらい出ていた。


まーこれは僕の頭がおかしい。1e-8 と 1e-9 って実際10倍違うんだよね…1000%違うとか言うべきだな。


まあわかった理論値で10倍はやくなるというところか。


まとめると、

  • sprintf / fprintf は CPU律速なので速くなる余地はある
  • けどIOも大概おそいのでwriteとprintfのスループットは10倍ぐらいしか違わない
  • 100倍速くするならエディタのメモリに流し込む的な仕組みが必要