如何让C语言变得更高效

海外服务器 (593) 2015-11-24 14:02:15

1. 避免不必要的函数调用

考虑下面的2个函数:

  1. void str_print( char *str ) 
  2.   
  3.   
  4.     int i; 
  5.   
  6.     for ( i = 0; i < strlen ( str ); i++ ) { 
  7.   
  8.         printf("%c",str[ i ] ); 
  9.   
  10.     } 
  11.   
  12. void str_print1 ( char *str ) 
  13.   
  14.   
  15.     int len; 
  16.   
  17.     len = strlen ( str ); 
  18.   
  19.     for ( i = 0; i < len; i++ ) { 
  20.   
  21.         printf("%c",str[ i ] ); 
  22.   
  23.     } 
  24.   
  25. }
  1. <​span class="Apple-style-span" 
  2. style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">
  3. 请注意 这两个函数的功能相似。然而,第一个函数调用strlen()函数多次,而第二个函数只调用函数strlen()一次。因此第一个函数性能明显比第二个好。
  4. </span>
  5. <span style="color: red;">
  6. <strong>(更新:原作者应该是笔误,把第一个函数写成优于第二个,否则自相矛盾。)</strong>
  7. </span> 

2、避免不必要的内存引用

这次我们再用2个例子来对比解释:

  1. int multiply ( int *num1 , int *num2 ) 
  2.   
  3.   
  4.     *num1 = *num2; 
  5.   
  6.     *num1 += *num2; 
  7.   
  8.     return *num1; 
  9.   
  10. int multiply1 ( int *num1 , int *num2 ) 
  11.   
  12.   
  13.     *num1 = 2 * *num2; 
  14.   
  15.     return *num1; 
  16.   

 

  1. <span class="Apple-style-span" 
  2. style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px; white-space: normal;">
  3. 同样,这两个函数具有类似的功能。所不同的是在第一个函数( 1 for reading *num1 , 
  4. for reading *num2 and 2 for writing to *num1)有5个内存的引用,而在第二个函数是只有2个内存引用(one for reading *num2 and one for writing to *num1)。
  5. 现在你认为哪一个好些?
  6. </span> 

3、节约内存(内存对齐和填充的概念)

  1. struct { 
  2.   
  3.     char c; 
  4.   
  5.     int i; 
  6.   
  7.     short s; 
  8.   
  9. }str_1; 
  10. struct { 
  11.   
  12.     char c; 
  13.   
  14.     short s; 
  15.   
  16.     int i; 
  17.   
  18. }str_2; 

假设一个字符需要1个字节,short占用2个字节和int需要4字节的内存。起初,我们会认为上面定义的结构是相同的,因此占据相同数量的内存。然而,而str_1占用12个字节,第二个结构只需要8个字节?这怎么可能呢?

请注意,在第一个结构,3个不同的4个字节被分配到三种数据类型,而在第二个结构的前4个自己char和short可以被采用,int可以采纳在第二个的4个字节边界(一共8个字节)。

4、使用无符号整数,而不是整数的,如果你知道的值将永远是否定的。

有些处理器可以处理无符号的整数比有符号整数的运算速度要快。(这也是很好的实践,帮助self-documenting代码)。

THE END