对于c语言的一些特性,比如性能优化,这块通常从汇编可以很快找到优化点,这次就是简单描述循环展开带来优化性能提升
代码如下:
[C] 纯文本查看 复制代码 #include <stdint.h>
#include <stdio.h>
int add_for_once(int* nums, int len)
{
int i, sum = 0;
for (i = 0; i < len; i++) {
sum += nums[i];
}
return sum;
}
int add_for_forth(int* nums, int len)
{
int i, sum = 0;
for (i = 0; i < len / 4;) {
sum += nums[i];
sum += nums[i+1];
sum += nums[i+2];
sum += nums[i+3];
i += 4;
}
return sum;
}
int main()
{
int nums[2000];
int i, len = 2000, res = 0;
for (i = 0; i < len; i++) {
nums[i] = i;
}
res = add_for_once(nums, len);
printf("add_for_once: %d\n", res);
// res = add_for_forth(nums, len);
// printf("add_for_forth: %d\n", res);
return 0;
}
我们将第一个for循环进行每个循环做四次处理,则速度可以得到提升,在运算次数量大时更加明显。
其原理是对于循环指令这些属于是无效指令,每次循环都会去处理循环指令,浪费实际处理数据带来的性能消耗,一次做多个运算则能减少该损耗。
可以看下优化前执行时间和优化后执行时间比较。
优化前:

优化后:

观察汇编指令,可以发现优化后的代码每次循环都会处理四次加运算的指令:
一次循环处理一次运算:

一次循环处理四次运算:

|