- 论坛徽章:
- 9
|
本帖最后由 wlmqgzm 于 2016-12-26 13:49 编辑
我最近做一个大约1万行的代码,80%的精力都是在性能优化,也是全部自己写的代码
主要目标是代替memcache的模块,提供多数据表table, 加载保存和日志等功能,指令集在memcahe的基础上有不少扩展,包括类似 like 'aaa%'这样的语句,以及几种全表扫描的语句,
最早计划是1个半月完成,就是10月底完成。结果做完就不断的优化,不优化的话,单连接性能比memcache低,
基本上把所有可以优化的地方重新都做了一遍,实际用了3个半月,现在实现的版本已经比memcache略快了,而且内存分配是new/delete,全部动态申请内存,
整个底层库全部优化测试了一遍,
包括 spin_lock自己实现一个通用版本 ,主要使用C++14atomic,支持yield, 性能更高
std::unordered_map自己实现的circular_hash_map用环形队列重写了一个通用库版本,比std库提高了至少70%以上的性能,并且内存自动扩展和收缩
主要的优化思路是:
1)当在hash值对应的空间寻找,被占用则到下一个空间,依次类推,这个设计方案主要的优势是cache友好,因为是顺序查找。最大可以占用85%的空间,超过则自动扩展一倍。
2)hash值的缓存,这样扩展或者收缩的时候不用重新计算hash节约了一点计算量
3)hash计算采用SSE4.2实现
4)使用了一些标志位进行性能优化,包括限制查询次数等。。。。
5)参考linux核心kqueue的设计,使用2的N次方的长度,就可以利用与操作代替除法操作,进行最后的匹配,提高性能
command语句解析最早用boost::spirit做,觉得性能不够好,用自己的逻辑重写了一个版本,比spirit版本快了大约3倍
另外还要考虑高并发的情况,按照最大支持256个CPU并发的要求,将circular_hash_map分为256个组,
........
中间还支持过其他项目组框架设计,各种会议。。。。。
。。。。现在还在收尾, 手册已经写了70多页(小四字体),还没有写完。。。。。。。。。。 |
评分
-
查看全部评分
|