现在的位置: 首页 > 综合 > 正文

又要down size

2013年01月18日 ⁄ 综合 ⁄ 共 1313字 ⁄ 字号 评论关闭
去年,为了满足那些急切地想从劳动中获得解放,一厢情愿地认为在二十一世纪任何人的劳动都可以由工具来代替的测试工程师们,我要在一个资源极其抠门的系统中强行塞进一个自动测试功能。1M的code size上限所剩不多,大约百十来K,内存也只有2M,确实有些紧。
程序完成以后就开始down size。将近一个月,每天几十个字节地扣。头几天很有成就感,稍微做一些事就拿掉了三五K,越往后越艰难,三五十字节就让我欢喜万分。
在windows下做程序,没这么抠门过,所以根本没有经验,只能凭感觉摸索,不停地写些个小程序用VC和gcc做实验,观察编译后二进制文件的大小,以及编译器所做优化产生的影响。
去年底,又要在系统中加入万年历,庞大的数据量和计算量需要压缩存储,之后又要加入黄历。这个东西60年一轮回,60年中完全没有规律,数据量极大无比。我们先确定用比特位索引这个省存储空间的方法,只做三年的信息,需要33K的静态存储空间。又是几周的心血,压缩到了18K左右。
那一阵down size上瘾,看到别人的代码总想拿来改一改。msn名字也改为小一些,再小一些。
现在,又要down size,这是做嵌入系统最艰巨的挑战了。我资质愚钝,总结不出什么东西,把一同事整理的小tips拿过来一部分。

以下都是小抠小抠的注意点,可能比较平常,可能只能抠十几到几十个字节。

1. 当条件判断点不多的时候,请使用if/else,不要用switch/case,一般5个以上可以使用switch/case。当然这个跟编译器相关,有的编译器会生成一个hash table,条件判断的时候快速查找,当然必须branch比较多的时候效果才比较显著。
2. 删除没有用过的函数,如果存在的话,比较爽。
3. 如果某一个函数只被引用一两次,就直接在这一两处写,不要调用函数。需要注意的是,函数框架的要义在于共用service的抽取,而不在于function call的深度,千万不要为后者感到得意!function call越深,对stack的占用就可能越大。
4. 密切注意if/else,switch/case判断体里的重复代码,如果能够提取,尽量提到判断体外部去!比如说,可以使用判断体只取得一个数组元素的下标,而具体的相同运算放在判断体外部。这样做的意义在于两点:a,减小code size,明晰程序框架;b,缩小判断体的大小,尽量减少CPU流水线被清空的几率,因为大一点的跳转会清空流水线。
5. 尽量充分利用所分配的局部或者全局变量,不要因为一个小的原因就专门assign一个变量,当然调试用另当别论,但是你不可能所有的地方都要调试,调试的时候再说。
其实这些都是简单的coding style,希望不是一条一条的参照,而是内化为一种感觉。切记,会编两句程序算不了什么,因为这确实是一门精细的手艺,需要我们磨练数十载

对于data size optimization和perfomance optimization,优化点比较多,讲究也更多,MSDN有一篇介绍:Developing Optimized Code with Microsoft Visual C++ 6.0

抱歉!评论已关闭.