基于中间代码的优化中,循环的查找算法有哪些?循环优化的方法有哪些?举例说明。

基于中间代码的优化中,循环的查找算法有哪些?循环优化的方法有哪些?举例说明。



基于中间代码的优化中,循环的查找算法有哪些?循环优化的方法有哪些?举例说明。

西北工业大学编译原理课件第八章 代码优化.ppt

基于中间代码的优化中 循环的查找算法有哪些呢 循环的优化方法又有哪些?

循环判断外提

循环的查找算法:

1)利用控制点(dominator)查找循环

2)利用回边查找循环

3)强连通分量算法

4)深度优先遍历(Depth first traverse)算法

循环优化的方法:

1)循环不变量外提法

2)削弱运算强度法

3)归纳变量消除法

4)循环展开法

5)循环判断外提法

循环优化方法举例说明:

1.循环不变量外提法

优点:有效地减少代码的执行时间。

循环不变量指的是运算对象的值不随循环的重复执行而改变的变量。

例如下面的循环中,x的值是固定的5,所以不管经过多少次循环,y的值始终是a*a=25,与循环次数无关。所以可以采用循环不变量外提法,将其提出到循环外面,在循环的入口之前执行一次即可。
在这里插入图片描述

最后的变换结果如下图所示:

在这里插入图片描述

2.削弱运算强度法

优点:有效地减少代码的执行时间,提高运算效率。

可以将循环中运算强度较高的运算削弱,转换为运算强度较低的运算。

例如下面的循环中,b的值为1,k的值为2,d与i的变化情况如下:

1)i=1 ---------- d=1*2

2)i=1+1 --------d=(1+1)2=12+1*2

3)i=1+1+1 -----d=(1+1+1)2=12+12+12

4)i=1+1+1+1

在这里插入图片描述

可见,d的初值为2,每次循环增加1*2,这样可以将增量外提,使得循环内的运算由乘法变为加法,削弱了运算强度,减少了运行时间。

最后的变换结果如下图所示:

在这里插入图片描述

3.归纳变量消除法

优点:提高程序运行效率。

在一个循环L中,常遇到一些变量,其值与循环重复的次数有关。例如下图循环中的变量i,在循环中对其重复赋值i=i+1;另外,变量d=4*i,则变量d的值也具有此性质,且d与i之间还保持某种同步变化关系。这样的变量称为同族的归纳变量。

在这里插入图片描述

由于同族归纳变量同步地变化,在循环中有时可删除其中一些归纳变量的计算,最后的变换结果如下图所示:
在这里插入图片描述

4.循环展开法

优点:提高程序的局部性,有利于数据、指令的预取。

该项优化十分简单,但是只能应用到知道循环次数的循环上,对于不知何时终止的循环则无能为力。充分利用了循环展开的优点的时候,另外一个缺点也会随之而来——代码膨胀。所以,有些编译器是在代码大小小于某个阈值的时候,启用这项优化。
在这里插入图片描述

最后的变换结果如下图所示:
在这里插入图片描述

5.循环判断外提法

优点:降低指令的控制冲突,增进循环平行处理的可能性。

该项变化通常是将包含在循环中的分支语句提出到循环的外面。当然,这种方法也增大了代码大小。所以和循环展开法一样,需要一个阈值控制何时该项优化被采用。循环如下图所示:

在这里插入图片描述

最后的变换结果如下图所示:
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 二分查找是一种在有序数组查找特定元素的搜索算法。它的工作原理是,在数组的间位置开始查找,如果找到的元素正好是要查找的元素,那么查找就结束了;如果找到的元素大于要查找的元素,那么在数组的左半部分继续查找;如果找到的元素小于要查找的元素,那么在数组的右半部分继续查找。 下面是使用 Python 代码实现二分查找的例子: ``` def binary_search(arr, x): left = 0 right = len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == x: return mid elif arr[mid] < x: left = mid + 1 else: right = mid - 1 return -1 arr = [1, 2, 3, 4, 5, 6, 7, 8, 9] x = 5 result = binary_search(arr, x) if result != -1: print("元素 {} 在数组的索引为 {}".format(x, result)) else: print("元素 {} 不在数组".format(x)) ``` 在上面的代码,我们定义了一个名为 `binary_search` 的函数,该函数接受两个参数:一个有序数组 `arr` 和要查找的元素 `x`。在函数内部,我们使用一个 `while` 循环来不断地二分查找。当 `left` 大于等于 `right` 时,循环就会结束。在每次循环迭代,我们计算数组 ### 回答2: 二分查找是一种有效的搜索算法,适用于已排序的数组。它从数组的间元素开始,与目标元素进行比较,如果相等则直接返回,如果目标元素较小,则在数组的左半部分进行二分查找,如果目标元素较大,则在数组的右半部分进行二分查找,直到找到目标元素或者数组被缩小为空。 下面是一个用Python实现二分查找的示例代码: ```python def binary_search(arr, target): left = 0 right = len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 # 示例用法 arr = [2, 4, 6, 8, 10, 12, 14, 16, 18] target = 10 result = binary_search(arr, target) if result != -1: print(f"元素在数组的下标为 {result}") else: print("元素不在数组") ``` 在上面的示例代码,`binary_search`函数接受一个已排序的数组`arr`和目标元素`target`作为输入。通过维护一个左指针`left`和一个右指针`right`,不断将数组范围缩小,直到找到目标元素或者数组为空。如果找到了目标元素,则返回目标元素在数组的下标,否则返回-1表示目标元素不在数组。 运行上述示例代码,会输出"元素在数组的下标为 4",因为目标元素10在数组的下标为4。如果目标元素不在数组,例如将`target`修改为7,则输出"元素不在数组"。 ### 回答3: 二分查找是一种在有序数组查找特定元素的算法。它的思想是将数组划分为两个部分,并通过比较目标元素与数组间元素的大小关系,确定目标元素可能存在的部分。然后再在这个部分继续划分并查找,直到找到目标元素或者确定目标元素不存在。 下面是用Python实现二分查找的代码示例: ```python def binary_search(nums: list, target: int) -> int: low = 0 high = len(nums) - 1 while low <= high: mid = (low + high) // 2 if nums[mid] == target: return mid elif nums[mid] < target: low = mid + 1 else: high = mid - 1 return -1 # 测试代码 nums = [1, 3, 5, 7, 9] target = 7 result = binary_search(nums, target) if result != -1: print(f"目标元素在数组的索引位置为: {result}") else: print("目标元素不存在数组") ``` 以上代码,`binary_search` 函数接收一个有序数组 `nums` 和要查找的目标元素 `target` 作为参数。函数使用两个指针 `low` 和 `high` 来表示查找范围的起始和结束位置。通过将 `mid` 设置为 `low` 和 `high` 的平均值来确定间位置,并根据间位置的元素值与目标元素的大小关系调整查找范围。最终,如果找到目标元素,则返回其在数组的索引位置;如果没有找到,则返回 -1。 在上面的示例,我们使用有序数组 `[1, 3, 5, 7, 9]` 进行了一次二分查找,目标元素为 `7`。最终输出的结果是目标元素在数组的索引位置为 `3`,即数组下标从 `0` 开始计数,所以目标元素在数组的位置是第四个元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值