免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4454 | 回复: 14
打印 上一主题 下一主题

[算法] 寡人写代码的那些事,分享一下 [复制链接]

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-12-06 15:38 |只看该作者 |倒序浏览
本帖最后由 shang2010 于 2016-12-06 15:56 编辑

性能优化不是工期的重点,主要是实现功能(大概消耗70-80%的精力,干活的累)

然后处理新代码功能与原来代码仓库的各种issue或者上层业务bug问题
(这个环节狠考验人,总是有同事出来找茬,当然他们也没什么水平,——很屌丝被各种虐,还不给钱,倒是时时刻刻都活得提心吊胆的)

性能优化往往没机会到这个环节,有一次项目,领导属于放任管理,所以我这边才有机会做优化,
大概花了25%的时间,但是只消耗了10%的精力(测试活没有写代码的累)

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
2 [报告]
发表于 2016-12-06 15:43 |只看该作者
为什么性能优化只消耗10%的精力呢,原因很简单,

所有的代码都是我写的,所有的细节都清楚,只要摸对方向,性能问题分分钟钟被教育怎么做人

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
3 [报告]
发表于 2016-12-06 17:04 |只看该作者
因为是自主的,所以是可发展的

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
4 [报告]
发表于 2016-12-26 13:21 |只看该作者
本帖最后由 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多页(小四字体),还没有写完。。。。。。。。。。

评分

参与人数 1信誉积分 +10 收起 理由
shang2010 + 10 赞一个!

查看全部评分

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2016-12-26 14:07 |只看该作者
wlmqgzm 发表于 2016-12-26 13:21
我最近做一个大约1万行的代码,80%的精力都是在性能优化,也是全部自己写的代码
主要目标是代替memcac ...
当在hash值对应的空间寻找,被占用则到下一个空间,依次类推,这个设计方案主要的优势是cache友好


开发寻址?线性查找,还是二次查找?如果是二次的话,cache也没啥亲和性了吧,第一次不命中,第二次就跳好远,除非hash很小
另外还要考虑高并发的情况,按照最大支持256个CPU并发的要求,将circular_hash_map分为256个组
MPMC?是不是通常的都是这么个思路啊,Java里面的ConcurrentHashMap以前也是这么个思路

concurrencykit里面有一个支持SPMC的Hash,就是开发寻址的

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
6 [报告]
发表于 2016-12-26 15:49 |只看该作者
lxyscls 发表于 2016-12-26 14:07
开发寻址?线性查找,还是二次查找?如果是二次的话,cache也没啥亲和性了吧,第一次不命中,第二次 ...

线性查找,其实,等效于std::vector的连续查找,

是 开放寻址法 的一个实现,与类似算法的一个重要区别是:我的算法中每个hash都有 单独的最大搜索长度的限制,这样可以进一步提高性能,

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2016-12-26 16:31 |只看该作者
wlmqgzm 发表于 2016-12-26 15:49
线性查找,其实,等效于std::vector的连续查找,

是 开放寻址法 的一个实现,与类似算法的一个重要 ...
我的算法中每个hash都有 单独的最大搜索长度的限制,这样可以进一步提高性能
请问这个“最大搜索长度限制”怎么理解呢?
insert()的时候,不就是要找到尾巴上可以插入的地方吗?难道因为位移长了就不插入了?

search(),本来hash里面有的,总不能因为“最大长度限制”返回个nullptr吧

论坛徽章:
9
程序设计版块每日发帖之星
日期:2015-10-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-01 06:20:00程序设计版块每日发帖之星
日期:2015-11-02 06:20:00每日论坛发贴之星
日期:2015-11-02 06:20:00程序设计版块每日发帖之星
日期:2015-11-03 06:20:00程序设计版块每日发帖之星
日期:2015-11-04 06:20:00程序设计版块每日发帖之星
日期:2015-11-06 06:20:00数据库技术版块每周发帖之星
日期:2015-12-02 15:02:47数据库技术版块每日发帖之星
日期:2015-12-08 06:20:00
8 [报告]
发表于 2016-12-26 16:58 |只看该作者
本帖最后由 wlmqgzm 于 2016-12-26 17:08 编辑
lxyscls 发表于 2016-12-26 16:31
请问这个“最大搜索长度限制”怎么理解呢?
insert()的时候,不就是要找到尾巴上可以插入的地方吗?难道 ...

请问这个“最大搜索长度限制”怎么理解呢?
insert()的时候,一直按顺序找啊找,找到可以插入的地方,插入数据,
比较原始hash对应的bucket桶 最大搜索旧长度,如果更大,则存储新的最大搜索长度限制。否则,不保存。

search()的时候,一直按顺序找啊找,
每找下一个地址比较一下是否到达最大搜索长度,如果到达最大搜索长度还没有找到,说明根本就没有这个数据,可以提前返回了。

每个hash bucket桶 都有一个 单独的最大搜索长度的限制,这样可以进一步提高性能


评分

参与人数 1信誉积分 +10 收起 理由
lxyscls + 10 大概明白了,赞一个!

查看全部评分

论坛徽章:
154
2022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:5720周年集字徽章-年
日期:2022-10-26 16:44:2015-16赛季CBA联赛之深圳
日期:2022-11-02 14:02:4515-16赛季CBA联赛之八一
日期:2022-11-28 12:07:4820周年集字徽章-20	
日期:2023-07-19 08:49:4515-16赛季CBA联赛之八一
日期:2023-11-04 19:23:5115-16赛季CBA联赛之广夏
日期:2023-12-13 18:09:34
9 [报告]
发表于 2016-12-28 16:41 |只看该作者
本帖最后由 shang2010 于 2016-12-28 16:44 编辑

回复 4# wlmqgzm

看出来了,你们这边做的系统比较复杂,
我的只是一段小代码逻辑服务,查询缓存的,代码量整体有一两千行,自己手写的大概只有两三百行。
整个周期前后只有一个月,其中最后环节是上级主管做主要的测试工作的,然后我根据反馈进一步改进代码逻辑


如果做大又复杂的系统难免会大量采用第三方工业代码,例如std/boost等等,
不一样。你们整个周期差不多利索的话应该超过半年,甚至两三年的也有

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
10 [报告]
发表于 2016-12-29 00:17 |只看该作者
open addressing最大的问题是必须预留两个元素,一个表示未占用,另一个表示已删除。
cache友好就不要想了,除非步进长度为1。
总而言之用是可以用的,但是有些坑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP