我有一段很厉害的代码,不外传的那种
文 | 郭忠明@知乎
最近在知乎上看到一個問題,叫做“程序員有沒有很厲害、不外傳的代碼”。
?好像在這個遍地都是開源項目的時代,啥代碼都藏不住。
但其實,是有的,而且有不少!
很多算法在沒有公開前,普通程序員都完全想不明白是怎么做到的。
?
舉個例子。
80年代就有部分大神級程序員的代碼中使用了乘一個magic數字,然后移位,實現實質代替除法的功能,性能很快,代碼有效。
普通程序員完全不理解這些代碼的含義,為啥這樣寫也能行。實質是除數被除數同時乘以一個2的N次方的數字,那么結果不變,被除數如果是一個常量,那么兩個常量相除就得到了magic, 計算時先乘以magic再移位就實現了高性能除法,大約能夠有一個數量級的性能提升。
經過很多年后,該技術就慢慢擴散開了,成為不是秘密的秘密,一些編譯器內部集成了這些黑魔法。
直到intel 九代cpu后,該魔法才徹底在intel cpu上沒用了,intel cpu把除法從80個時鐘周期壓縮到了18個時鐘周期。
但是江湖上還流傳一種新的除法算法,大約比intel十代cpu快一倍,我這邊在做內存分配庫的free內部計算offset/ref size per bit尋找bit定位時有用,新除法算法的源代碼只有三行,非常簡單有效。
所以,free 才那么快,最小只有7ns, 要知道做一次除法就要18個時鐘周期了,那些快到不可思議的庫,不少背后是有各種秘密算法的黑科技加持。(注意: 有一些公開文章中的magic不能適配所有整數, 存在工程上的坑,高手都是親自寫代碼做全整數覆蓋驗證,不會輕易亂用)。
最近幾年比較出名的黑魔法一個是wait free queue, 尤其是多生產者/多消費者隊列,做量化交易領域的部分高手會弄這個東西,知乎上也見過有量化領域的人提到過具體的實現,就一句話的原理。
開源的都是最簡單的spsc單生產者單消費者隊列,一些源碼也有bug。寫的內存分配庫有用這個算法,用于跨線程內存釋放。
最新版本16線程并發下,主線程malloc 8字節1000萬,傳給其它16個線程, ?其它線程以生產者方式push到隊列,主線程以消費者方式pop出隊列,主線程free,五個動作累計,平均開銷大約是26ns,是堪稱神器級別的多線程并發工具包,有數千行源碼,只有很小的并發開銷。在內存分配庫的測試源碼用例的最后有測試。
總之,最近兩年寫的內存分配庫中,已經把自己能夠找到的黑魔法都用上了,所以,性能才會比google tcmalloc快一個數量級。
尤其在高性能領域,江湖上那些快到不可思議的庫,真的打開,里面到處都是黑魔法一樣的代碼,不少繞了一圈的算法,如果不告訴你這些代碼都是干什么用的,基本很難理解原來如此。
舉一個例子,寫的內存分配庫中由于是bitmap算法,會大量使用移位操作,但是源碼中沒有1<<N的移位,用其它更快的算法代碼替換掉了,又是一堆的magic, 移位操作的性能提升了3倍,原因在于intel cpu的內置移位操作單元不足,而現代cpu都是多發射的,導致現代cpu的多發射時移位操作和相關上下文的串行等待,拖累性能表現。一直到intel cpu 12代cpu增加了一倍的移位操作單元(查一下最新改進的說明就明白),才算徹底解決了這個瓶頸。測試源碼和內存分配庫so文件在下面下載。
https://gitee.com/wlmqgzm
話說回來,你們有那種私藏的黑科技代碼嗎?歡迎在評論區分享!
后臺回復關鍵詞【入群】
加入賣萌屋NLP/IR/Rec與求職討論群
后臺回復關鍵詞【頂會】
獲取ACL、CIKM等各大頂會論文集!
總結
以上是生活随笔為你收集整理的我有一段很厉害的代码,不外传的那种的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NLP、炼丹技巧和基础理论文章索引
- 下一篇: 一文搞懂 PyTorch 内部机制