我有一段很厉害的代码,不外传的那种
文 | 郭忠明@知乎
最近在知乎上看到一个问题,叫做“程序员有没有很厉害、不外传的代码”。
好像在这个遍地都是开源项目的时代,啥代码都藏不住。
但其实,是有的,而且有不少!
很多算法在没有公开前,普通程序员都完全想不明白是怎么做到的。
举个例子。
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等各大顶会论文集!
我有一段很厉害的代码,不外传的那种相关推荐
- 【Python教程】Jupyter Notebook把一段很长的代码分成多行的解决办法
Jupyter Notebook把一段很长的代码分成多行的解决办法 使用Jupyter Notebook时经常会遇到一段代码很长 导致代码块向右边延伸了很多 感觉 很! 不! 方! 便! 所以就想把这 ...
- python一看就很厉害的代码_Python学习教程:怎么写出让人看起来就很舒服的代码?...
Python学习教程:怎么写出让人看起来很优雅舒服的代码?让人眼前一亮! 很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比如变量命名和函数命名以及注释等一些内容的规范性,久而久之 ...
- 一段很有意思小代码:视频中提取心率
通过功率谱的方法估计视频中人脸的心率 原理: 由麻省理工学院多媒体实验室提出的,基于光电容积脉搏波描记( Photoplethysmography,PPG)原理,结合独立成分分析,利用人面部视频测量出 ...
- 当程序员说“这代码写的可真烂”,他们的意思是“这烂代码不是我写的”。而当他们说这段代码有些“小问题”时,很可能这代码是他们自己写的...
英文原文:What Programmers Say vs. What They Mean 你是否听到过同事说"这段代码不言自明"?你的同事的这句话的实际意思是这段代码不需要写注释. ...
- 有一个写代码很厉害的老板是怎样一种体验?
参与本期直播预约.直播间互动抽奖.用户调查问卷,还有机会获得亲笔签名图书.智能音箱等精美礼品!预约链接:https://live.csdn.net/room/csdnnews/eBgAmPpx 有一个 ...
- 为什么我们很难看到代码 5 分钟前的样子?
[CSDN 编者按]呵,对一名资深的 CV 工程师而言,想看五分钟之前的代码,撤销是不可能撤销的,顶多是 Ctrl-A 之后 Backspace,再重新 CV-- 作者 | Austin Z. Hen ...
- 16位代码段与32位代码段的区别
16位代码段与32位代码段的区别: 16位代码段与32位代码段的区别如下: 16位代码段最长只能为64k,段内偏移量为16位,默认的指令地址及操作地址为16位: 32位代码段最长可以4G,段内偏移量 ...
- 特权级——保护模式的特权级检查 DPL,RPL,CPL, 一致代码段,非一致代码段
特权级是保护模式下一个重要的概念,CPL,RPL和DPL是其中的核心概念,查阅资料无数,总结如下. 一.CPL.RPL.DPL简单解释 CPL是当前进程的权限级别(Current Privil ...
- CPL DPL RPL的区别 一致性代码段和非一致性代码段
概述:在谈论保护模式编程的时候,一直会有这样的困惑:为什么除了CPL和DPL还有RPL?什么时候高特权级不能访问低特权级?什么时候低特权级不能访问高特权级?一致性代码和非一致性代码有什么区别?等等这些 ...
最新文章
- python动态规划详解_经典动态规划例题整理(Python版)
- 玩转双核CPU:左手画圆,右手画方
- 从eclipse中下载到手机的android程序总是旧的版本
- 有关糖尿病模型建立的论文_预测糖尿病结果的模型比较
- 数据结构与算法--解决问题的方法-顺时针打印矩阵
- pakeage php国内镜像,Packagist/Composer中国全量镜像 | 严佳冬
- jQuery-1.9.1源码分析系列(一)整体架构
- 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
- jmeter 压力测试教程全解
- 搜狗输入法精简_搜狗输入法10.10去图标精简版+9.4.21小米定制版
- eyoucms表单令牌
- java后台模板_Java服务端后台常用模板
- 【高并发】如何解决可见性和有序性问题?这次彻底懂了!
- 英语简单的6种构词法
- ATL之深入浅出书评(潘爱民)
- ovh服务器可以做电影网站吗,OVH kimsufi服务器评测
- 浅析 Spring Security 的认证过程及相关过滤器
- h5页面点击进入关注微信公众号
- 互联网金融行业分析及产品设计
- 网站子域名扫描的几种方法