我最近两年都在做内存分配库的优化,已经比google tcmalloc 快了一个数量级,大约4万行源码,应该算比较优秀的程序员了。
水平暴涨,是从某天发现chinaunix c++论坛版主有一个微线程或者协程的架构的开源库,当时std库和腾讯等公司的同类库都没有开源,读完了源码和测试代码后,突然发现c++代码原来可以这样写,std库里面从来就没有这样的方案,彻底打破了对传统c++体系的崇拜。原来大厂技术高管的c++水平这么高,代码性能如此高,大约比同类场景下的普通程序员的代码快4倍,思考的是如何做一个框架,用通用高性能的方案解决某一类技术问题,从整个体系的角度来降低编程的难度,提升整个体系的性能和效率。一次编程处处可用,框架里面附带了一些常用库,优点就是一次解决bug终身解决bug, 也不用求人改库bug。
之前都白学了,之前以为熟练掌握std库的用法就是优秀的程序员。彻底放弃对熟练掌握c++语言的追求,放弃熟练掌握c++ std库的追求,彻底摆脱对std库的崇拜,有的语言装B成了一种宗教了。
开始用体系的角度思考源码,开始重构整个高性能的编程体系和库体系,将分散的技术方案整合起来,形成一个标准的随时可用的c++库,陆续在工作中,把用到的std库全部重写了一遍,发现很多函数都是60/70年代的旧技术方案,例如std string find函数,最近几十年有很多种新算法出现,最优秀的是 two way算法,于是就使用了two way算法。发现只要按照最新的技术方案重写一遍,基本上耗时最大的几个函数都是N倍的提升,于是决定在高性能c++领域发展下去,陆续把各个常用std库都写完了。日常有看到某个优秀的新算法的介绍,就加入自己的库中,陆续积累了近十多万行源码的库,很多算法都比较新,包括多线程 wait free 框架等。
摆脱对c++语言 和 std 库的盲目崇拜后,就再也没有困惑了,就不关心语言本身了,语言只是工具而已,不关心c++的某个奇怪的写法了,主要的关注点都是如何彻底解决某一类编程问题,解决后将最优的方案保存到自己的c++库中,保持随时可用的状态,代码都用最直白最易懂的方式写,最好能够被人和机器都直白的理解,完全不玩那些过多的花样了。写完了std库的常用组件后就有很多经验值了(每个组件就几百到几千行源码,慢慢就写完了),由于对性能对质量有追求,反复的优化,实践出真知,很快就能积累一堆的技巧,这些技巧在书本上是没有的,很多就是经验,刷了很多高性能的经验值。
终于技术水平的积累已经很高了,工作中某个产品比对标的某上市公司有数量级的性能优势。某一天觉得内存分配库可以优化,动手去做后,刚写完第一个版本就比 google tcmalloc 库快了大约一倍,这个库是世界级大牛的杰作,于是感觉这块有潜力可挖,继续优化三个月后已经有一个数量级的性能提升了,准备把代码写到极限,又继续优化就想看一下真正的极限到底在哪里,又是什么样的代码。只要摆脱对c++语言std库的束缚,相信编译器,各种手段一起上,反复思考每一部分的最优解,反复重写代码,留下最优解,期间陆续写或者修改过大约20万行源码,留存4万行有效代码,在工程中学习,在实践中学习,反复测试和修改源码,让项目本身成为学校,让代码成为教材,让每次修改后的最优结果成为老师,就可以快速成长。
陆续实现了各个子方向的最优解,例如 平均1ns 开销的 thread local 算法;平均1ns开销的 jump 表跳到不同的执行函数,用于处理不同大小的内存申请;平均 2.6ns 开销的bitmap pool算法;平均几ns开销的 push / pop 多生产者/多消费者 wait free queue, 用于处理跨线程的内存释放。很多新算法都是工程实践的结果,不是刻意为之,保持开放的心态,以实事求是的态度对待江湖中的每一种说法,用代码去验证,不盲从不盲信,在实践中检验,这块实验田终于开花结果,解决了很多困扰多年的想法,验证了很多种高并发的技术模型,也在实践中证明了 wait free 无锁无等待的算法是可以实现的且非常稳定可靠,更加清晰的理解了多线程极高并发下遇到的问题,理解了实质是要解决什么问题。
在两年的实践中做过大量的测试,发现某个声称要代替c++语言的新语言的思路是错误的方向,技术原型上就是错误的,那个语言的基础库里面也有多线程bug,多线程bug的特点是: 如果代码足够快问题就会暴露,如果代码足够慢就没有问题。有的人对多线程极高并发会遇到的问题实质本身是什么完全没有理解,把锅全部甩到程序员身上,企图让大家把多线程的问题理解为只是普通程序员的锅,换个限制多的语言就解决问题了,其实就那些垃圾库根本解决不了多线程极高并发下的稳定性问题,这个问题是一个体系的问题。一堆不太懂多线程的人弄了一个号称能够解决全部多线程问题的语言,一个实验性质的语言。如果真的懂多线程,明白多线程高并发下遇到的问题的实质,就会轻松实现平均开销只有几ns的多生产者/多消费者 wait free 无锁无等待队列(实质是平淡无奇的代码),也会非常容易的理解和解决各种多线程bug。实在看不过去某语言的夸大宣传,让大家付出代价去学,学一个实质上解决不了多线程高并发问题的语言。
总之就是 多实践多写代码,不盲从不轻信,有独立的思考,刷了足够的经验值了以后,就可以成为高手。
以上
========================================================================
附录: 由于内存分配库性能过高,为了避免被人误会,下面给出了详细说明。
内存分配库 目前有开放二进制so文件,测试源码,用户手册(最新大约52页,详细介绍了整体设计方案和思路,以及很多的其它内存库没有考虑过的黑科技)下载,下载链接见后。
下面这篇大约50页,写于今年年初
这篇是核心代码刚完成时的简介,两三页,写于去年年初
测试的性能情况如下,单位均为ns, 下面是性能测试截屏。
内存分配库so文件和性能测试源码 在下列地址下载
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有