从CPU层面谈谈优化

大多数时间,大家都在从设计和算法上优化效率(这类优化往往效果比较明显,比如一个二分查找可以轻易将时间复杂度降低为lg(n))。但是在实现上,却很少有人注重实现效率,而理由是反正每年都会有更高频率的CPU出现,我何必花那个心思呢(Java程序员尤其擅长使用这个理由@_@)。 我个人不是完全同意上面的说辞,在不影响代码的可读性和花费不高的代价下,我习惯性的会写最我当前所知道的性能最高的写法。 在很早以前,我一度只有在编写汇编时才可以计算出汇编条数。随着代码量的增加,……

使用缓存优化数据请求

继上一篇场景之后,事情还没有完。 我有一堆struct obj对象(数量级可能为千级), 客户端需要频繁拉取这些信息中的一部分去显示(比如,当切换标签页时)。 由于这一操作可能会很频繁,而struct obj对象并不算小,如果每一次都重新拉取全部数据,有点让人不舒服,而且对流量也是一种很大的浪费。因此就琢磨着怎么去优化整个过程,以使在此过程中使数据传输量最小。 第一反应,肯定就是对整个列表加一个version字段,每当有obj对象改变时,version加1,当客户端进行拉取时,拿着他本地……

内存数据库和进程内cache

上家公司是做TPS游戏的,因此其实对玩家数据的操作其实不是很频繁,而且由于当时服务器的数据库部分是单独剥离开给指定的人维护的。因此对于cache这一块,从来没有仔细的考虑过。新公司的游戏需要与离线玩家进行战斗,因此在写业务逻辑时是需要cache支持的。但是总觉得cache设计之初的定位有些问题,由此引发了一些思考。 最初我一直在纠结于内存数据库,我觉得诸如redis这种内存数据库已经把所有数据内容都常驻内存了。那么设计一个cache真的有必要么?直接随用随取不就行了么。在……

cache命中率对效率的影响

趁着去买菜的空档, 突然间想起来cache命中率失败的代价从来还没测过, 随后又想到网上很多人争论如果两个for循环嵌套, 到底是大循环放在外面效率高还是小循环放在外面效率高. 虽然有大牛说不同情况不同分析, 但到底为什么却没有分析. 于是就for循环与cache命中率写了一段测试代码访问1G的数据来测了一下性能, 竟然有1倍之多. 代码如下: #include <Windows.h> #include "assist.h" //cache line 64 byte //cache size 4Mbyte typedef unsigned char cache_line_t[64]; cache_li……