当前位置:软件学习 > 其它软件 >>

【编程珠玑】第九章:代码调优

上一篇:http://www.zzzyk.com/kf/201205/131602.html


一,概述
        1)代码调优的目的是什么?
              减少CPU运行时间;减少分页或增加高速缓存命中率;减少程序所需空间
        2)代码调优为什么不能“滥用”?
              1>效率的角色:不成熟的优化是大量编程灾害的根源,可能危及程序正确性、功能及可维护性。
              2>度量工具:利用性能检测工具,找到“热点”代码,即程序关键区域,然后优化。
              3>设计层面:效率问题可以从多个方面进行解决(算法和数据结构、数据结构重组、硬件升级),只有没有更好的解决方案才进行代码优化。
              4>双刃剑:有些优化在特定程序中可以提速,但在另外程序中有可能急剧减速。
     
        3)急救方案集锦
               1>整数取模(取模运算时间大于加减法执行时间)
                    k=k%n;
                    可以替换为
                    if(k>=n)  k=k-n;
                2>函数、宏、和内联代码
                     内联函数和宏具体参见博客 :   http://www.zzzyk.com/kf/201205/133135.html            
3>顺序搜索
                     采用“哨兵”  让循环体不用 每次都判断边界。从而增加了运行速度   
                     将循环展开,替换自增。
[html]
a[100]=50; 
     
    for(i=0; ; ++i) 
    { 
        if(a[i] == t) 
            break; 
    } 
   
    if(i == 100) 
        printf("false\n"); 
    else 
        printf("true\n"); 

替换为
[html]
a[100]=50; 
for(i=0; ; i+=4) 

    if(a[i] == t) 
    { 
        break; 
    }        
    if(a[i+1] == t) 
    { 
        i+=1; 
        break; 
    }    
    if(a[i+2] == t) 
    { 
        i+=2; 
        break; 
    }    
    if(a[i+3] == t) 
    { 
        i+=3; 
        break; 
    }    
    if(a[i+4] == t) 
    { 
        i+=4; 
        break; 
    }    

    if(i == 100) 
        printf("false\n"); 
else 
    printf("true\n"); 

              4>计算球面距离
       
       4)大手术---二分搜索
 
[html]
#include "stdio.h" 
#include<windows.h>  
int main() 

    int i; 
    int t=500;//要查找的数  
     
    int a[1000]; //初始化数组  
    for(i=0;i<1000;++i) 
        a[i]=i; 
     
     
    a[1000]=50;//哨兵  
    i=512; 
    int l=-1; 
    if(a[511]<t) 
        l=1000 -512; 
    while(i!=1) 
    { 
        i=i/2; 
        if(a[l+i] < t) 
            l = l+i; 
         
    } 
   
    int p=l+1; 
    if(p> 1000 || a[p] != t) 
    { 
        p=-1; 
        printf("false\n"); 
    }    
    else 
    { 
        printf("位置为:%d\n",p); 
        printf("true\n"); 
    }    
     
}  
 
二,习题
        3)while 语句的开销 大于 if语句
        4)宏 不适合用于递归函数中
        5)不排序 进行二分查找,如果找到则肯定存在。找不到也不一定 不存在。
        6) isdigit(char c) {if(c>='0' && c<='9'}
例子
[html]
#include <stdio.h> 
#include <ctype.h> 
#define in_area(x, a, b) ((x)>=(a) && (x)<=(b)) 
#define isxdigit(x) (isdigit(x) || in_area(x, 'a', 'f') || in_area(x, 'A', 'F') ) 
 
void print( int boolean ) 

    printf( "%s\n", boolean ? "true" : "false" ); 

 
int main(int argc, char *argv[]) 

    // for testing ....  
    print(isxdigit('0')); 
    print(isxdigit('9')); 
 &n

补充:软件开发 , 其他 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,