【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
(7)尽量采用查询的方式,少采用计算的方式,注意分析经验数据
做过服务器侧软件的朋友都知道,单个socket的响应时间要尽可能的短,因为这有这样我们才能在短时间内响应更多的用户。如果把宝贵的时间放在一些临时性的计算上面,那么就不大合算了。历史的经验运行数据对于我们进行数据分析是很重要。举一个例子来说:我们知道操作系统分配内存的时候,刚开始的访问要求都是混乱无章的。等到运行一段时间之后,我们的内存就会充斥着更多的内存碎片。此时此刻,即使我们需要获取一块较大的内存都是比较困难的。为了获得我们需要的内存,操作系统不得不把操作系统中暂时使用不到的内存临时放到硬盘上面,等到重新需要的时候再次加载进来,这在无形之中就增加了运行时间,降低了运行效率。如果我们能够从经验数据中得到启发,知道应该在机器开机启动的时候就知道怎样进行数据的分配,短时间内实现机器的最优状态,就可以节省时间,还提高了用户的满意程度。
(8)if-else语句的合理使用
比如说存在下面一个语句
- if(a && b)
- {
- /* 代码处理 */
- }else{
- /* 代码处理 */
- }
我们想要处理a && b都为真的情况比较复杂一些。只有a和b都为真的时候,我们才能进入到相应的模块进行处理。但是一般来说,a和b出现的频率是不一样的。此时此刻,我们一般出现频率较高的a放在前面。因为a一旦判断失败,我们就不再需要判断,b的结果对我们此时来说是没有意义的。因此合理调整a和b的顺序也会在无形之中提高我们的运行效率。和这段代码类似的另外一段代码是:
- if(a || b)
- {
- /* 代码处理 */
- }else{
- /* 代码处理 */
- }
上面这段代码的基本原理和前一段代码是一样的。我们需要把经常出现的情况放在前面,因为一旦a成立,b条件的判断就变得无足轻重了。
(9) 多使用指针
指针是一把双刃剑,用好了可以事半功倍,我们可以做一个小的测试:
- char* strncpy(char* dst, const char* src, size_t size)
- {
- char* pAddress = dst;
- size_t count = 0;
- if(NULL == dst || NULL == src || 0 == size)
- {
- return NULL;
- }
- while(count < size)
- {
- dst[count] = src[count];
- count++;
- }
- return pAddress;
- }
上面的这段话,我们完全可以写成这样的形式:
- char* strncpy(char* dst, const char* src, size_t size)
- {
- char* pAddress = dst;
- if(NULL == dst || NULL == src || 0 == size)
- {
- return NULL;
- }
- while(size-- > 0)
- {
- *dst ++ = *src ++;
- }
- return pAddress;
- }
因为不管是什么样的数组,都要经过起始地址、偏移值、取值三个步骤。而指针是比较直接的,通过不断的指针递增,可以省略中间取首地址、偏移数值的过程,快速实现数值的复制。
(10) 优化算法是提高代码效率很重要的一个环节
我们都知道快速排序、堆排序是解决排序问题的重要方法,但是它需要很大的内存,主要来自于堆栈的不确定性。所以如果开发排序功能且数据比较庞大的话,我们完全有机会实现这样的优化。另外一个算法的优化就是我们可以把平时运行过程中不是特别紧急的任务降低运行的优先级,比如说可以干一会休息一会,10秒钟就sleep一下,这样就可以把宝贵的时间留给业务的处理。当然,这种优化与其说是算法的优化,不如说是流程的优化。
后注:
优化是以牺牲代码的可移植性、降低代码的阅读性作为代码的。代码的优化也不仅仅是以上的提到的几种方法。就我个人的经验而言,我觉得可以从下面几个方面综合进行考虑:a)提高硬件的配置。只要银子允许,我们就可以在短期内实现效率的大幅提升,当然它的提高也是有局限性的。b)优化流程,我们的代码经常需要添加新的功能,就会在不知不觉当中添加很多判断、申请很多资源,甚至重复做一些无意义的操作,这在很大程度上降低了我们代码的运行效率,如果把握的好,重新对项目或者版本进行功能上的梳理,随之而来的效率提升甚至不亚于第一种方法,这是一种降低成本的好方法,当然需要软件架构师的精确把握和控制。c)提高代码编写技巧,优化代码,这方面需要时间,也需要进行总结。做得好效果显而易见,做得不好反而降低了原来的工作效率。