首页 > 试题广场 >

下列哪些方法是针对循环优化进行的

[不定项选择题]
下列哪些方法是针对循环优化进行的
  • 强度削弱
  • 删除归纳变量
  • 删除多余运算
  • 代码外提

常见的代码优化技术有:复写传播,删除死代码, 强度削弱,归纳变量删除

(下面抄几页PPT和别人的博客,QAQ,关键是编译原理没认真学过,咱家不太会。。。)

如果有同学有研究过这部分内容,并总结过,有更好的答案,请联系我删除本篇非原创解答

复写传播:

图片说明

  • 复写语句:形式为f = g 的赋值
    • 优化过程中会大量引入复写
    • 复写传播变换的做法是在复写语句f = g后,尽可能用g代表f
    • 复写传播变换本身并不是优化,但它给其他优化带来机会
      • 常量合并(编译时可完成的计算)
      • 死代码删除

死代码删除

  • 死代码是指计算的结果决不被引用的语句
  • 一些优化变换可能会引起死代码

代码外提

  • 代码外提是循环优化的一种
  • 循环优化的其它重要技术
    • 归纳变量删除
    • 强度削弱

例:

while(i <= limit - 2) ...
// 代码外提后变成
t = limit - 2;
while(i <= t) ...

归纳变量删除

j = j - 1
t4 = 4 * j
t5 = a[t4]
if t5 > value goto B3
  • j和t4的值步伐一致地变化,这样的变量叫作归纳变量
  • 在循环中有多个归纳变量时,也许只需要留下一个
  • 这个操作由归纳变量删除过程来完成
  • 对本例可以先做强度削弱,它给删除归纳变量创造机会

强度削弱

  • 强度削弱的本质是把强度大的运算换算成强度小的运算,例如将乘法换成加法运算。

参考资料

  1. "某个不知名PPT"
  2. "《编译原理之代码优化》(By 墨篙和小奶猫)"
发表于 2019-08-15 22:46:57 回复(25)
多余运算在编译期就会自动优化吧
发表于 2019-10-25 19:21:18 回复(0)
代码优化也可分为局部优化、 循环优化和全局优化:
局部优化指的是在只有一个入口、 一个出口的基本程序块上进行的优化。
循环优化是对循环中的代码进行的优化,在一个程序运行时,相当多的一部分时间会花在循环上,因此,基于循环的优化非常重要。
全局优化是在整个程序范围内进行的优化。

删除多余运算

使生成的目标代码减少而执行速度较快
也叫删除公共子表达式

循环优化:对循环中的代码段,可以进行代码外提、强度削弱和删除归纳变量等优化。
删除多余运算应该不是专门针对循环优化的。

发表于 2019-10-12 21:08:30 回复(0)

成功避开所有正确答案

发表于 2020-01-10 14:24:59 回复(1)
循环优化 代码外提 删除归纳变量 强度削弱
发表于 2022-01-11 09:18:48 回复(1)
常见的代码优化技术:复写传播(代码外提)、删除死代码、强度削弱、归纳变量删除
发表于 2021-12-27 14:27:54 回复(0)
常见的代码优化技术有:复写传播,删除死代码, 强度削弱,归纳变量删除,A、B、D正确
编辑于 2022-03-11 11:57:24 回复(0)
结合高赞第一的理解相应编译优化方法的理解补充
复写传播
它通过将变量的值复制到使用该变量的地方,来消除中间变量的使用,从而减少内存访问的开销。它的基本原理是,当一个变量的值已知并且不会改变时,可以将该值直接复制到相关的地方,而不是通过中间变量进行访问。
优化前
int a = 10;
int b = a + 5;
int c = b * 2;
System.out.println(c);
优化后
int a = 10;
int c = (a + 5) * 2;
System.out.println(c);
在这个例子中,变量a的值为10,变量b通过加法表达式获取a的值加上5,变量c通过乘法表达式获取b的值乘以2。如果编译器进行复制传递优化,它可以直接将a的值复制到b和c的使用点,而不需要中间变量b。
删除归纳变量
它通过识别和移除不再使用的变量,从而减少内存占用和提高程序的执行效率。这种优化技术的基本原理是,当一个变量的值不再被使用,或者对变量的修改不会影响程序的结果时,可以安全地将该变量从程序中删除。
优化前
int a = 10;
int b = a + 5;
System.out.println(b);
优化后
int b = 10 + 5;
System.out.println(b);
在这个例子中,变量a的值为10,变量b通过加法表达式获取a的值加上5,并将结果打印出来。然而,变量a在表达式计算后没有被再次使用,也没有对它进行修改。因此,编译器可以进行删除无用变量优化,将变量a从程序中删除。
死代码删除
用于识别和移除不会对程序执行结果产生影响的无效代码,以提高程序的执行效率和减少不必要的计算开销。

死代码可以是以下几种类型:

  1. 未被使用的变量或常量:如果一个变量或常量在程序中定义了但没有被使用,编译器可以识别并将其删除,因为它不会对程序的输出结果产生任何影响。

  2. 无法达到的代码块:当存在分支语句(如条件语句或循环语句)时,编译器可以分析程序的控制流,识别出那些永远不会被执行的代码块,并将其删除。

  3. 无效的操作:如果存在一些对变量进行操作(如赋值、算术运算等),但这些操作的结果没有被使用或没有对程序的执行结果产生影响,编译器可以删除这些无效的操作。

  4. 无法访问的代码:当程序中存在被注释掉的代码或者被条件语句所排除的代码块时,编译器可以识别这些代码是无法访问到的,并将其删除。


发表于 2023-05-22 23:09:34 回复(0)
常见的循环代码优化:复写传播、强度削弱、归纳变量删除、删除死代码
发表于 2022-07-16 22:17:24 回复(0)
常见的代码优化技术有:复写传播,删除死代码, 强度削弱,归纳变量删除
发表于 2021-01-05 22:24:12 回复(0)
对于常用的普通for循环而言,提取数组长度为一个变量到循环外是比较好的习惯,对于增强型for循环还是普通for的选择,要看循环的对象的数据结构,对于数组这样随机访问的数据结构而言,一般采用下标索引的方式遍历,对于链表这样的顺序访问的结构,一般采用迭代器进行遍历。
发表于 2020-05-01 16:57:12 回复(0)
真棒,已移除。
发表于 2020-02-02 08:44:48 回复(0)
多余运算在编译期则会被自动优化,无需担心
发表于 2023-05-19 23:12:06 回复(0)
删除多余运算应该不是专门针对循环优化的。

发表于 2022-02-07 23:06:56 回复(0)
正经人谁会出这种题 你会吗? 我不会
发表于 2021-08-02 10:00:51 回复(0)
常见的循环代码优化:删除多余代码,删除归纳变量,强度削弱,复写传播也叫代码外提
发表于 2021-06-01 00:33:02 回复(0)
蒙对了。。
发表于 2020-10-07 17:10:39 回复(0)
强度削弱是将大的运算改成小的运算比如乘法改成加法 归纳变量删除,归纳变量一致性变化的变量 只需要将这种类似的变量删除,好像是删除冗余变量 代码外提是将一些变量提到循环外边
编辑于 2024-02-14 22:27:49 回复(0)
删除归纳多余变量不属于对循环优化
发表于 2023-05-06 20:00:47 回复(0)
代码外提 删除归纳变量 强度削弱
发表于 2022-10-19 09:46:04 回复(0)