背景

我们的新项目有个比较复杂的全区全服交易行系统,其中搜索和推荐是高实时性全区服多维度排序的,并且要支持比较复杂的标签交集查询和属性范围查询的自由组合。 当有订单发生变化时,它不仅仅会影响全服状态下搜索和推荐条件的结果变化,也会同时影响商品维度的聚合,交易行层面的数据聚合。

前言

我们终于在年初的时候最后完成了整体服务器框架对C++20协程的支持和接入。虽然之前陆陆续续抽时间改造一些组件,让它支持C++20协程,期间也记录了一些早期的设计思路和踩的坑(包括 《libcopp接入C++20 Coroutine和一些过渡期的设计》《libcopp对C++20协程的接入和接口设计》),其中不乏一些C++20协程使用上可能打破我们常规思路细节和编译器的BUG。而且这些都是各个组件的改造,并没有最后整合到一起。

前言

最近看Rust相关东西的时候看到一篇关于压缩可执行文件的文章。压缩可执行文件对嵌入式开发特别有用,但是延伸一下用来减少我们游戏行业里预编译的工具二进制包大小和Android/iOS的库也是蛮有用的。

原文见这里: https://jamesmunns.com/blog/tinyrocket/

基本流程

  1. Release编译,移除调试符号文件,开启最小化size优化(-Oz)
  2. 使用LLVM的全量LTO
  3. 使用xargo重新编译标准库(std)和核心库(core)(这个C/C++不容易模仿,而且编译选项十分难搞)
  4. 移除jemalloc(服务器程序还是留着比较好,内置的malloc实现一般碎片比较厉害。虽然C/C++默认也不是jemalloc,很多项目为了新能还是会用它)
  5. 移除panic的详情信息(这个仅适用于Rust
  6. strip(由GNU的binutils提供),参考命令: strip [二进制]
  7. UPX进一步压缩加壳

尝试改造优化

然后尝试使用上面的流程改造我们的 gmtools-cli 。原先我是直接开LTO+Release编译的,编出的文件大小为4.4MB(4520728字节)。