最近一些心得
最近特别忙, 每天写程序的时间都不够。有些东西在做完之前不想公开谈,所以只把一些笔记发在公司内部的周报里了。等这段时间过去,再贴到这里来。
不过还是有一些泛泛的心得可以写写的。
前几天遇到一个优化的问题。我想采用定期计算路图的方式优化寻路的算法。而不用每次每个单位在想查找目标的时候都去做一次运算并记录下路径结果。一切都看起来很顺利,算法的正确性很快就被验证了。可是最后实际跑的时候,发现在生成路图的地方会稍微卡一下影响流畅性。
遇到这类问题,第一反应通常是考虑如何优化。比如是不是应该换用多线程,是不是要分摊每次的计算量,是否可以简化问题减少运算的次数等等。
我在这些方面都尝试做了几个小时的努力。结果发现,如果我简单的把 O3 优化加上的话,可以直接加速 2 倍,相当于我其它方面做的努力的提升(当然其它方面的努力也是有效的)。
这不太符合我的平常遇到的情况。大部分情况下,C 语言编写的程序,编译器优化能做到 25% 的性能提升已经足够好了(通常 C++ 风格的代码可以提升更多)。或许是因为纯算法代码的因素导致这次的结果吧。
但是,采用多线程这样的方式来改进程序,不符合我的直觉。我不认为把程序结构改的复杂来获得需要的性能并不是第一选择。而且,在设计算法之初,我已经做过估算,认为在当前的硬件环境下,并太可能造成容忍不了的延迟的。
最后自己检查了自己的代码实现。发现我不小心把一个 O(n) 复杂度的算法实现成 O(n2) 了。修改正确后,速度一下就提高了 100 倍。
这次是个不多见的教训。程序结果的正确性被验证,但是依然存在 bug 。只是 bug 仅仅导致了代码运行缓慢,把一段需要 1/1000 秒应该完成的任务,减慢到了 1/10 秒的数量级。
另一点心得:
在外部条件不多变的问题上,适当的采用一些常量是很有效的。比如断定某个字符串长度不超过 64 ,数组的元素不超过 16 个等等。
对于 C 风格的代码,我们总能看到一些 MAXxxx 的宏来直接定义数组的大小。在 C++ 教科书上总是把他们当成反面教材,要求换用 std::vector 。
但实际上,如果能对目标问题做精确的评估,并在代码中做出合理的断言。固定长度的数组的好处也很明显。数据结构比较简单,程序会更加健壮。尤其是在多线程环境中更能体现出来。
即使是一些动态分配的部分,如果能估算出大致的总量,那么把内存池定义在结构中也更简洁一些。即,不额外用 malloc 分配一块新内存,再用指针去引用它。而是直接在结构中声明出内存块,让结构内的动态指针引用自身内存池中的内存。
这样,复杂的对象在内存中的数据布局依然是连续的。管理它们(生命期)的代码成本也比较低。对并发支持也更简单。不过,这同时也要求对需求的估算更明确,适合于用在严格定义好的内聚性很高的模块内部。
前段时间读过一本 Objective-C 的书。影响比较深刻的是 cocoa 框架对内存的管理方案。
虽然 cocoa 也使用引用计数。但是却不是在对象引用计数到 0 时就立刻释放内存。而是结合了 autorelease pool 。
这可以减少在当前栈帧访问无效对象的 bug ,而不需要引入 C++ 中的 RAII ,以比较清晰可显的法则定义出内存管理的方案。
Comments
Posted by: whisper | (22) November 18, 2014 09:40 AM
Posted by: 赵中 | (21) May 17, 2013 04:38 PM
Posted by: Anonymous | (20) April 1, 2013 08:23 PM
Posted by: icicle | (19) March 28, 2013 07:20 AM
Posted by: rex | (18) March 23, 2013 08:19 PM
Posted by: 金山毒霸 | (17) March 23, 2013 02:55 PM
Posted by: swz | (16) March 19, 2013 07:39 AM
Posted by: zzl | (15) March 15, 2013 03:15 PM
Posted by: 什么浏览器最好用 | (14) March 14, 2013 07:53 PM
Posted by: lichking | (13) March 13, 2013 10:16 PM
Posted by: dew | (12) March 13, 2013 01:46 PM
Posted by: zack | (11) March 12, 2013 09:38 PM
Posted by: Cloud | (10) March 12, 2013 03:41 PM
Posted by: 3w哥 | (9) March 12, 2013 12:41 PM
Posted by: HJC | (8) March 11, 2013 03:36 PM
Posted by: dew | (7) March 11, 2013 02:43 PM
Posted by: dew | (6) March 11, 2013 02:39 PM
Posted by: dew | (5) March 11, 2013 02:33 PM
Posted by: dew | (4) March 11, 2013 02:33 PM
Posted by: haohaolee | (3) March 11, 2013 01:56 PM
Posted by: CoolDesert | (2) March 11, 2013 01:11 PM
Posted by: 游客2 | (1) March 11, 2013 12:39 PM