IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    《编程珠玑》:代码优化

    Yukang (moorekang@gmail.com)发表于 2010-08-05 00:00:00
    love 0

    编程珠玑里面代码优化这一章。

    问题1 函数,宏,内联代码

    #define max(a,b) ((a)>(b)? (a):(b))
    
    float max(float a,float b)
    {
        return a>b? a:b;
    }
    inline float max(float a,float b)
    {
        return a>b? a:b;
    }
    

    上面这个函数到底哪一个快一些?测试了一下。宏效率是高一点,但是对于加上编译器优化以后基本没什么区别了。

    问题2 顺寻搜索

    int search1(int v)
    {
        for(int i=0;iif(vec[i]==v)
                return i;
        return -1;
    }
    
    int search2(int v)
    {
        vec[N]=v;
        int i;
        for(i=0; ;i++)
            if(vec[i] == v)
                break;
        if(i==N)
            return -1;
        return i;
    }
    
    int search3(int v)
    {
        vec[N]=v;
        int i;
        for(i=0; ;i+=8)
        {
            if(vec[i]==v) break;
            if(vec[i+1]==v) {i+=1; break;}
            if(vec[i+2]==v) {i+=2; break;}
            if(vec[i+3]==v) {i+=3; break;}
            if(vec[i+4]==v) {i+=4; break;}
            if(vec[i+5]==v) {i+=5; break;}
            if(vec[i+6]==v) {i+=6; break;}
            if(vec[i+7]==v) {i+=7; break;}
        }
        if(i==N)
            return -1;
        return i;
    }

    这三个函数哪一个效率最好?据说第二个提高5%,第三个会提高10%~20%(对于老实计算机)。在我的机子上测试了一下,N=10000000。并不如书上说的能提高多少, 反而最原始的写法在优化后效率更高,确实是这样的数据。

    问题三 二分查找

    数组大小为1000。 单位ms。

    确实第二个版本提高了一些,第四个版本甚至提高了一半的效率。 测试是一个麻烦的事情,因为同一时间处理器调度了其他进程,但多次测试还是能给一个大概的印象。第二个例子的优化没起什么作用,也许现在的编译器优 化技术比以前更好的,得出的结果并不如书上所说。在一个算法复杂度确定的情况下改变一些写法会有一点提升,但是对于不同的输入规模也许就得不到什么提高, 而且编译器优化以后基本差别就更小了。为了那么一点效率的 提升增加了代码的复杂度得不偿失。原理那章也说了,不成熟的优化是大量编程的祸害,会危机程序的正确性、功能性、和可维护性。 王道还是改变数据结构或者算法,除非确定一个部分的代码会经常被调用很多次,在这里可以花一些功夫去优化。优化是把双刃剑,玩火者,小心自焚,哈哈。



沪ICP备19023445号-2号
友情链接