在 Hacker News 上看到個有趣的 scalability 問題,在 Mac 上的 sprintf()
因為有 lock 造成的 scalability 問題:「Curious lack of sprintf scaling (aras-p.info)」。
作者注意到 Mac 在多 CPU 下 sprintf()
會有 scalability 的問題,要注意到這邊的 Y 軸是對數比例:
用了 std::stringstream <<
反而更慢 (作者還酸了一句「Zero cost abstractions」):
然後用了 Instruments 跑 profiling 找問題,可以看到看起來跟 locale 有關:
一般的情況下應該不會是問題,但如果是需要大量 sprintf()
組字串的人就會比較要注意了。
在「What else can we do?」這段有提到一些解法,包括了 stb_sprintf 當作替代品,以及 {fmt} 作為 iostreams 的替代品,然後另外是利用 to_chars 來解決,如果只是要把數字轉成字串。
算是蠻有趣的 bug hunting 過程,對於開發者來說,一般性的重點還是在 profiling,找到對的問題然後再往下提出解法...