硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1509|回复: 0
收起左侧

C性能优化----循环展开

[复制链接]

2

主题

2

回帖

8

积分

新手上路

积分
8
发表于 2024-9-5 16:12:26 | 显示全部楼层 |阅读模式
对于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循环进行每个循环做四次处理,则速度可以得到提升,在运算次数量大时更加明显。
其原理是对于循环指令这些属于是无效指令,每次循环都会去处理循环指令,浪费实际处理数据带来的性能消耗,一次做多个运算则能减少该损耗。
可以看下优化前执行时间和优化后执行时间比较。
优化前:

优化后:

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

一次循环处理四次运算:

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 21:30 , Processed in 0.240427 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表