百科问答小站 logo
百科问答小站 font logo



程序员有很厉害,不外传的代码吗? 第1页

  

user avatar   guo-zhong-ming-26 网友的相关建议: 
      

有的,而且有不少,很多算法在没有公开前,普通程序员都完全想不明白是怎么做到的。例如: 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文件在下面下载。

gitee.com/wlmqgzm




  

相关话题

  编程语言中类型前置和类型后置的优缺点各是什么? 
  最难调试修复的 bug 是怎样的? 
  为什么很多程序员爱用 Vim? 
  程序员行业有哪些越早知道越好的道理? 
  做程序员是真的因为喜欢吗?还是因为收入比较高? 
  程序员真的不用太注重编程吗? 
  创业公司如何和大公司竞争,找到优秀的开发者和技术合伙人? 
  既然有 HTTP 请求,为什么还要用 RPC 调用? 
  看到字节跳动给程序员的节日卡「2020 - 1024」你有啥感受?码农 996 是命中注定吗? 
  你有哪些用计算机技能解决生活问题的经历? 

前一个讨论
罗技是如何做到鼠标滚轮可以在无阻尼和有阻尼间切换的?
下一个讨论
欧洲非英语母语国家怎么翻译好莱坞电影名的?





© 2024-05-17 - tinynew.org. All Rights Reserved.
© 2024-05-17 - tinynew.org. 保留所有权利