1. 避免不必要的函数调用
考虑下面的2个函数:
- void str_print( char *str )
- {
- int i;
- for ( i = 0; i < strlen ( str ); i++ ) {
- printf("%c",str[ i ] );
- }
- }
- void str_print1 ( char *str )
- {
- int len;
- len = strlen ( str );
- for ( i = 0; i < len; i++ ) {
- printf("%c",str[ i ] );
- }
- }
- <span class="Apple-style-span"
- style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">
- 请注意 这两个函数的功能相似。然而,第一个函数调用strlen()函数多次,而第二个函数只调用函数strlen()一次。因此第一个函数性能明显比第二个好。
- </span>
- <span style="color: red;">
- <strong>(更新:原作者应该是笔误,把第一个函数写成优于第二个,否则自相矛盾。)</strong>
- </span>
2、避免不必要的内存引用
这次我们再用2个例子来对比解释:
- int multiply ( int *num1 , int *num2 )
- {
- *num1 = *num2;
- *num1 += *num2;
- return *num1;
- }
- int multiply1 ( int *num1 , int *num2 )
- {
- *num1 = 2 * *num2;
- return *num1;
- }
- <span class="Apple-style-span"
- style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">
- 同样,这两个函数具有类似的功能。所不同的是在第一个函数( 1 for reading *num1 ,
- 2 for reading *num2 and 2 for writing to *num1)有5个内存的引用,而在第二个函数是只有2个内存引用(one for reading *num2 and one for writing to *num1)。
- 现在你认为哪一个好些?
- </span>
3、节约内存(内存对齐和填充的概念)
- struct {
- char c;
- int i;
- short s;
- }str_1;
- struct {
- char c;
- short s;
- int i;
- }str_2;
假设一个字符需要1个字节,short占用2个字节和int需要4字节的内存。起初,我们会认为上面定义的结构是相同的,因此占据相同数量的内存。然而,而str_1占用12个字节,第二个结构只需要8个字节?这怎么可能呢?
请注意,在第一个结构,3个不同的4个字节被分配到三种数据类型,而在第二个结构的前4个自己char和short可以被采用,int可以采纳在第二个的4个字节边界(一共8个字节)。
4、使用无符号整数,而不是整数的,如果你知道的值将永远是否定的。
有些处理器可以处理无符号的整数比有符号整数的运算速度要快。(这也是很好的实践,帮助self-documenting代码)。