【19】循环优化

2024-08-29 11:12
文章标签 优化 循环 19

本文主要是介绍【19】循环优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为了提升循环的效率,编译器会针对循环的编译进行多种方式的优化,比如:循环无关代码外提,循环展开等

1.循环无关代码外提

  • 循环无关代码:循环中值不会发生变化的表达式。通过将这些循环无关的代码提出循环外,可避免重复执行这些表达式,实现性能提升。
int foo(int x, int y, int[] a) {int sum = 0;for ( int i = 0; i<a.length; i++) {sum += x * y + a[i];}return sum;
}

循环无关代码:(1)表达式 :x * y (2)循环判断条件:a.length

优化后代码如下:

int foo(int x, int y, int[] a) {int sum = 0;int t0 = x * y;int t1 = a.length;for ( int i = 0; i<t1; i++) {sum += t0 + a[i];}return sum;

2.循环展开

  • 循环展开:在循环体中重复多次循环迭代,并减少循环次数的编译优化。
int foo(int x, int y, int[] a) {int sum = 0;for ( int i = 0; i< 64 ; i++) {sum += (i % 2 == 0) ? a[i] : -a[i];}return sum;
}

经过一次展开后,形成如下代码

int foo(int x, int y, int[] a) {int sum = 0;for ( int i = 0; i< 64 ; i += 2) { // 注意这里的步数是2sum += (i % 2 == 0) ? a[i] : -a[i];sum += ((i+1% 2 == 0) ? a[i+1] : -a[i+1];}return sum;
}

当循环的数目是固定值,且非常小时,即时编译器会将循环全部展开,此时,原本循环中的循环判断语句就不存在了,取而代之的是若干个顺序执行的循环体。

int foo(int[] a) {int sum = 0;for( int i = 0 ;  i<4 ;i++ ) {sum += a[i];}return sum;
}

完全展开后

int foo(int[] a) {int sum = 0;sum += a[0];sum += a[1];sum += a[2];sum += a[4];return sum;
}

即使编译器会在循环体的大小和循环展开次数之间做出权衡。

3.循环判断外提

  • 将循环中的if语句外提至循环之前,并且在该if语句的两个分支中分别放置一份循环代码
int foo(int[] a) {int sum = 0;for( int i = 0 ;  i<a.length ;i++ ) {if(a.length > 4) {sum += a[i];} else {sum += a[i] + 1;}}return sum;
}

经过优化后

int foo(int[] a) {int sum = 0;if(a.length > 4) {for( int i = 0 ;  i<a.length ;i++ ) {sum += a[i];} } else {for( int i = 0 ;  i<a.length ;i++ ) {sum += a[i] + 1;} }return sum;
}

4.循环剥离

  • 循环剥离:将循环的前几个迭代或者后几个迭代剥离出循环的优化方式。背景是循环的前几个迭代或后几个迭代都包含特殊处理。通过将这几个特殊的迭代逻辑剥离后,原本的循环体的规律性更加明显,从而触发进一步的优化。
int foo(int[] a) {int sum = 0;int j = 0;for( int i = 0 ;  i<a.length ;i++ ) {sum += a[j];j = i;}return sum;
}

通过剥离第一个迭代,代码如下:

int foo(int[] a) {int sum = 0;if(0 < a.length) {sum += a[0];for( int i = 1;  i<a.length ;i++ ) {sum += a[i-1];}}return sum;
}

这篇关于【19】循环优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117700

相关文章

JAVA中while循环的使用与注意事项

《JAVA中while循环的使用与注意事项》:本文主要介绍while循环在编程中的应用,包括其基本结构、语句示例、适用场景以及注意事项,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录while循环1. 什么是while循环2. while循环的语句3.while循环的适用场景以及优势4. 注意

详解Spring Boot接收参数的19种方式

《详解SpringBoot接收参数的19种方式》SpringBoot提供了多种注解来接收不同类型的参数,本文给大家介绍SpringBoot接收参数的19种方式,感兴趣的朋友跟随小编一起看看吧... 目录SpringBoot接受参数相关@PathVariable注解@RequestHeader注解@Reque

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者