循环优化

2025年6月17日 | 阅读7分钟

循环优化是最有价值的与机器无关的优化,因为程序的内循环占用程序员的大部分时间。

Loop Optimization

如果我们减少内循环中的指令数量,那么程序的运行时间可能会得到改善,即使我们增加了该循环之外的代码量。

代码优化的好处

以下是代码优化的各种好处列表

  • 它有助于提高性能,从而使代码运行更快并使用更少的资源。
  • 它用于减小生成的代码的大小,这使得更容易分发。
  • 此技术可以导致消耗更少的电能并使其更节能。

代码优化的局限性

以下是代码优化的各种局限性列表

  • 这可能会导致更复杂的代码,使其难以理解和调试。
  • 很难确定花费在该过程上的时间和资源。

以下不同的技术对于循环优化很重要

  1. 代码移动
  2. 归纳变量消除
  3. 强度降低
  4. 循环不变量
  5. 循环合并
  6. 循环交换
  7. 不切换
  8. 循环分裂
  9. 循环剥离
  10. 循环分割
  11. 循环展开
  12. 循环反转

1.代码移动

代码移动用于减少循环中的代码量。此转换获取一个可以在不影响程序语义的情况下移出循环体的语句或表达式。

示例

优化前的代码

代码移动后的结果如下

2. 归纳变量消除

归纳变量消除用于替换内循环中的变量。

它可以减少循环中的加法次数。它提高了代码空间和运行时性能。

Loop Optimization

在此图中,我们可以将赋值 t4:=4*j 替换为 t4:=t4-4。唯一会出现的问题是,当我们第一次进入块 B2 时,t4 没有值。因此,我们在进入块 B2 时放置一个关系 t4=4*j。

3. 强度降低

  • 强度降低用于用目标机器上更便宜的操作替换昂贵的操作。
  • 添加一个常数比乘法更便宜。因此,我们可以在循环内用加法替换乘法。
  • 乘法比求幂更便宜。因此,我们可以在循环内用乘法替换求幂。

示例

强度降低技术后,代码将是

注意:在上面的代码中,计算 s=s+6 比 j=3 *i 更便宜

4. 循环不变量方法

此方法处理将循环迭代期间不会更改的计算移出循环,以最大限度地减少不必要的计算。

示例

优化前的代码

循环不变量方法后,结果如下

5. 循环合并

此方法用于将两个或多个循环组合成一个循环。它最大限度地减少了编译多个循环所需的时间。

示例

优化前的代码

循环合并技术后的结果如下

6. 循环交换

此技术交换嵌套循环以改善内存访问模式,主要用于多维数组。

示例

优化前的代码

循环交换技术后的结果如下

7. 不切换

此技术旨在在涉及少量 case 的 if-else 情况下,从 switch 语句中删除复杂性。

示例

优化前的代码

不切换技术后的代码如下

8. 循环分裂

此技术意味着将一个循环分成更小的循环,以便通过隔离独立任务来实现更好的性能。

示例

优化前的代码

循环分裂技术后的结果如下

9. 循环剥离

此技术单独处理循环的前几次迭代。它通过模拟循环体中的复杂操作来优化性能。

示例

优化前的代码

循环剥离优化技术后的代码结果如下

10. 循环分割

它通过将循环分成多个循环来消除循环的复杂性。在其中,所有循环都有相同的体,但它们迭代不同的索引范围。这有助于减少依赖关系,从而使代码更兼容。

示例

优化前的代码

循环分割优化技术后的代码结果如下

11. 循环展开

此技术是一种循环转换技术,有助于优化程序的执行时间。它通过消除循环控制指令和测试指令来提高程序的运行速度。

示例

优化前的代码

循环展开优化技术后的代码结果如下

12. 循环反转

此技术用于反转分配给索引变量的值的顺序。它有助于消除依赖关系。

示例

优化前的代码

循环反转优化技术后的代码结果如下

关于循环优化的常见问题解答

1. 循环优化技术是什么意思?

它用于提高程序中循环的性能,方法是减少冗余操作、最大限度地减少执行时间并提高程序的效率。

2. 列出不同类型的循环优化?

  • 与机器无关的优化:它用于改进 中间代码以获得更好的目标代码作为输出。
  • 与机器相关的优化:这种类型的优化是在生成目标代码后完成的。它涉及 CPU 寄存器和一些绝对内存引用。

下一主题DAG 表示