文 | 郭忠明@知乎

最近在知乎上看到一个问题,叫做“程序员有没有很厉害、不外传的代码”。

好像在这个遍地都是开源项目的时代,啥代码都藏不住。

但其实,是有的,而且有不少!

很多算法在没有公开前,普通程序员都完全想不明白是怎么做到的。

举个例子。

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等各大顶会论文集!

我有一段很厉害的代码,不外传的那种相关推荐

  1. 【Python教程】Jupyter Notebook把一段很长的代码分成多行的解决办法

    Jupyter Notebook把一段很长的代码分成多行的解决办法 使用Jupyter Notebook时经常会遇到一段代码很长 导致代码块向右边延伸了很多 感觉 很! 不! 方! 便! 所以就想把这 ...

  2. python一看就很厉害的代码_Python学习教程:怎么写出让人看起来就很舒服的代码?...

    Python学习教程:怎么写出让人看起来很优雅舒服的代码?让人眼前一亮! 很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比如变量命名和函数命名以及注释等一些内容的规范性,久而久之 ...

  3. 一段很有意思小代码:视频中提取心率

    通过功率谱的方法估计视频中人脸的心率 原理: 由麻省理工学院多媒体实验室提出的,基于光电容积脉搏波描记( Photoplethysmography,PPG)原理,结合独立成分分析,利用人面部视频测量出 ...

  4. 当程序员说“这代码写的可真烂”,他们的意思是“这烂代码不是我写的”。而当他们说这段代码有些“小问题”时,很可能这代码是他们自己写的...

    英文原文:What Programmers Say vs. What They Mean 你是否听到过同事说"这段代码不言自明"?你的同事的这句话的实际意思是这段代码不需要写注释. ...

  5. 有一个写代码很厉害的老板是怎样一种体验?

    参与本期直播预约.直播间互动抽奖.用户调查问卷,还有机会获得亲笔签名图书.智能音箱等精美礼品!预约链接:https://live.csdn.net/room/csdnnews/eBgAmPpx 有一个 ...

  6. 为什么我们很难看到代码 5 分钟前的样子?

    [CSDN 编者按]呵,对一名资深的 CV 工程师而言,想看五分钟之前的代码,撤销是不可能撤销的,顶多是 Ctrl-A 之后 Backspace,再重新 CV-- 作者 | Austin Z. Hen ...

  7. 16位代码段与32位代码段的区别

    16位代码段与32位代码段的区别: 16位代码段与32位代码段的区别如下: 16位代码段最长只能为64k,段内偏移量为16位,默认的指令地址及操作地址为16位:  32位代码段最长可以4G,段内偏移量 ...

  8. 特权级——保护模式的特权级检查 DPL,RPL,CPL, 一致代码段,非一致代码段

    特权级是保护模式下一个重要的概念,CPL,RPL和DPL是其中的核心概念,查阅资料无数,总结如下. 一.CPL.RPL.DPL简单解释     CPL是当前进程的权限级别(Current Privil ...

  9. CPL DPL RPL的区别 一致性代码段和非一致性代码段

    概述:在谈论保护模式编程的时候,一直会有这样的困惑:为什么除了CPL和DPL还有RPL?什么时候高特权级不能访问低特权级?什么时候低特权级不能访问高特权级?一致性代码和非一致性代码有什么区别?等等这些 ...

最新文章

  1. python动态规划详解_经典动态规划例题整理(Python版)
  2. 玩转双核CPU:左手画圆,右手画方
  3. 从eclipse中下载到手机的android程序总是旧的版本
  4. 有关糖尿病模型建立的论文_预测糖尿病结果的模型比较
  5. 数据结构与算法--解决问题的方法-顺时针打印矩阵
  6. pakeage php国内镜像,Packagist/Composer中国全量镜像 | 严佳冬
  7. jQuery-1.9.1源码分析系列(一)整体架构
  8. 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
  9. jmeter 压力测试教程全解
  10. 搜狗输入法精简_搜狗输入法10.10去图标精简版+9.4.21小米定制版
  11. eyoucms表单令牌
  12. java后台模板_Java服务端后台常用模板
  13. 【高并发】如何解决可见性和有序性问题?这次彻底懂了!
  14. 英语简单的6种构词法
  15. ATL之深入浅出书评(潘爱民)
  16. ovh服务器可以做电影网站吗,OVH kimsufi服务器评测
  17. 浅析 Spring Security 的认证过程及相关过滤器
  18. h5页面点击进入关注微信公众号
  19. 互联网金融行业分析及产品设计
  20. 网站子域名扫描的几种方法

热门文章

  1. UITextField属性
  2. 追MM与设计模式的有趣见解
  3. 毕业2年,我的工作小结
  4. 腾讯回应QQ读取用户浏览器历史记录
  5. 一个小码农对嵌入式的理解
  6. QT——设置可执行文件图标
  7. ubuntu常见问题
  8. java socket oc_Java Socket编程(三) 服务器Sockets
  9. go设置后端启动_为什么 Rubyists 应该考虑学习 Go
  10. 推荐系统可利用的特征