Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1332620
  • 博文数量: 92
  • 博客积分: 10389
  • 博客等级: 上将
  • 技术积分: 1918
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-10 16:13
文章存档

2014年(1)

2012年(15)

2009年(6)

2008年(37)

2007年(72)

2006年(54)

我的朋友

分类: LINUX

2008-01-25 14:51:28

优化就是内储器大小和CPU的战争最终都是用户忍受程度与成本矛盾

如果中国的大学都出这样的有能力的学生,何苦IT行业这样狼狈。

中国的硬件是可以迅速建立起来的,但是软件素质以及文化程度

需要的时间何只几年而已。几十年也不够啊。不在多说了。

连接文章简介:

需要领略进步者状态的请看下面连接的全文:

http://blog.csdn.net/quanming1119/archive/2005/08/10/450545.aspx

目录__ 2

C代码优化方案__ 4

1、选择合适的算法和数据结构__ 4

2、使用尽量小的数据类型__ 5

3、减少运算的强度__ 5

1)、查表(游戏程序员必修课)_ 5

2)、求余运算__ 6

3)、平方运算__ 6

4)、用移位实现乘除法运算__ 6

5)、避免不必要的整数除法__ 8

6)、使用增量和减量操作符__ 8

7)、使用复合赋值表达式__ 8

8)、提取公共的子表达式__ 9

4、结构体成员的布局__ 9

1)按数据类型的长度排序__ 10

2)把结构体填充成最长类型长度的整倍数__ 10

3)按数据类型的长度排序本地变量__ 10

4)把频繁使用的指针型参数拷贝到本地变量__ 11

5、循环优化__ 12

1)、充分分解小的循环__ 12

2)、提取公共部分__ 13

3)、延时函数__ 13

4)、while循环和do…while循环__ 14

6)、循环展开__ 14

6)、循环嵌套__ 15

7)、Switch语句中根据发生频率来进行case排序__ 16

8)、将大的switch语句转为嵌套switch语句__ 17

9)、循环转置__ 18

10)、公用代码块__ 19

11)提升循环的性能__ 19

12)、选择好的无限循环__ 20

6、提高CPU的并行性__ 21

1)使用并行代码__ 21

2)避免没有必要的读写依赖__ 22

7、循环不变计算__ 23

8、函数__ 24

1Inline函数__ 24

2)不定义不使用的返回值__ 24

3)减少函数调用参数__ 24

4)所有函数都应该有原型定义__ 24

5)尽可能使用常量(const)_ 25

6)把本地函数声明为静态的(static)_ 25

9、采用递归__ 25

10、变量__ 25

1register变量__ 25

2)、同时声明多个变量优于单独声明变量__ 26

3)、短变量名优于长变量名,应尽量使变量名短一点__ 26

4)、在循环开始前声明变量__ 26

11、使用嵌套的if结构__ 26


 

选择一种合适的数据结构很重要,如果在一堆随机存放的数中使用了大量的插入和删除指令,那使用链表要快得多。数组与指针语句具有十分密切的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。

在许多种情况下,可以用指针运算代替数组索引,这样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。下面的代码作用是相同的,但是效率不一样。

    数组索引                指针运算

    For(;;){                p=array

    A=array[t++];          for(;;){

                                a=*(p++);

    。。。。。。。。。                  。。。。。。

    }                      }

指针方法的优点是,array的地址每次装入地址p后,在每次循环中只需对p增量操作。在数组索引方法中,每次循环中都必须根据t值求数组下标的复杂运算。

能够使用字符型(char)定义的变量,就不要使用整型(int)变量来定义;能够使用整型变量定义的变量就不要用长整型(long int),能不使用浮点型(float)变量就不要使用浮点型变量。当然,在定义变量后不要超过变量的作用范围,如果超过变量的范围赋值,C编译器并不报错,但程序运行结果却错了,而且这样的错误很难发现。

ICCAVR中,可以在Options中设定使用printf参数,尽量使用基本型参数(%c%d%x%X%u%s格式说明符),少用长整型参数(%ld%lu%lx%lX格式说明符),至于浮点型的参数(%f)则尽量不要使用,其它C编译器也一样。在其它条件不变的情况下,使用%f参数,会使生成的代码的数量增加很多,执行速度降低。

一个聪明的游戏大虾,基本上不会在自己的主循环里搞什么运算工作,绝对是先计算好了,再到循环里查表。看下面的例子:

旧代码:

    long factorial(int i)

    {

        if (i == 0)

            return 1;

        else

            return i * factorial(i - 1);

    }

新代码:

    static long factorial_table[] =

        {1 1 2 6 24 120 720  /* etc */ };

    long factorial(int i)

    {

        return factorial_table[i];

    }

如果表很大,不好写,就写一个init函数,在循环外临时生成表格。

http://blog.csdn.net/quanming1119/archive/2005/08/10/450545.aspx

阅读(2268) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~