写点什么

C 语言性能优化:循环展开

用户头像
一笑置之
关注
发布于: 2021 年 03 月 22 日
C 语言性能优化:循环展开

概念:在 C 语言中,循环展开技术是一种提升程序执行速度的非常有效的优化方法,它可以由程序员手工编写,也可由编译器自动优化。循环展开的本质是,利用 CPU 指令级并行,来降低循环的开销,当然,同时也有利于指令流水线的高效调度。


例程:举一个最简单的例子,一个 100 次的循环:


void f(void){ int x[100]; int i; for (i = 1; i <= 100; i++) { x[i] = x[i] * 3 + 7; }}
复制代码


循环展开的写法如下:


void f(void){ int x[100]; int i; for (i = 1; i <= 100; i+=2) { x[i+0] = x[i+0] * 3 + 7; x[i+1] = x[i+1] * 3 + 7; }}
复制代码

注意,这里递增步长 i += 2,就是说,循环次数从原来的 100 次,减少为循环 100/2 = 50 次了。


循环展开的优点:

第一,减少了分支预测失败的可能性。

第二,增加了循环体内语句并发执行的可能性,当然,这需要循环体内各语句不存在数据相关性。


循环展开的缺点:

第一,造成代码膨胀,导致 ELF 文件(或 Windows PE 文件)尺寸增大。

第二,代码可读性显著降低,前一个人写的循环展开代码,很可能被不熟悉的后续维护人员改回去。


附 1:例程循环展开前的汇编代码



附 2:例程展开后的汇编代码



用户头像

一笑置之

关注

还未添加个人签名 2019.08.10 加入

还未添加个人简介

评论

发布
暂无评论
C 语言性能优化:循环展开