【性能】【算法】for循环,性能提高

这篇具有很好参考价值的文章主要介绍了【性能】【算法】for循环,性能提高。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

■提高性能的方法

・原理

1.1.java处理中,计算阶乘,为什么展开循环可以提高效率

1.2.从cpu的流水线角度,再说明一下

1.3.介绍一下 cup的指令流水线

■实际运用

1.求和

代码

结果  

2.求阶乘 (性能提高效果明显)

代码

结果

测试电脑性能

自己电脑

堆内存并非越大,效率越高!!!!!!

电脑001

电脑002(虚拟机,公用一个cup)

媳妇的电脑

堆内存并非越大,效率越高!!!!!!!

爸爸的电脑


====

■提高性能的方法

通过展开循环,提高效率。

(算法,CPU原理)

・原理

1.1.java处理中,计算阶乘,为什么展开循环可以提高效率

展开循环可以提高效率的原因是避免了重复的循环操作。在计算阶乘的过程中,我们需要对一个数从1乘到该数本身,如果使用循环来实现这个操作,就需要每次都进行一次循环迭代,直到达到该数。而展开循环的方式,可以直接将每一次循环的结果串联起来,避免了重复的循环操作。

---

举个例子,假设要计算5的阶乘。使用循环的方式,需要进行5次循环迭代,分别计算1x2、2x3、3x4、4x5,最后得到120。而展开循环的方式,可以直接计算1x2x3x4x5,得到结果120,避免了重复的循环操作。

--

因此,展开循环可以减少循环迭代次数,提高运算效率。但需要注意的是,展开循环在处理大数阶乘时可能会造成溢出问题,需要进行适当的优化处理。

1.2.从cpu的流水线角度,再说明一下

https://rcwap.com/newsdetail_630.html

从CPU流水线的角度来看,展开循环可以提高效率的原因是减少了分支(branch)导致的流水线停顿(pipeline stall)。

----

在计算阶乘的过程中,循环结构通常会引入条件分支,用于判断循环是否继续。当分支预测(branch prediction)失败时,CPU的流水线会发生停顿,等待分支判断结果返回。这会导致流水线中断,浪费了一些CPU周期。

----

而如果采用展开循环的方式,即在代码中展开多个循环迭代,相当于将多个循环迭代的结果直接写入代码中。这样就避免了循环和条件分支的存在,减少了分支预测失败的机会,减少了流水线停顿。

---

通过减少流水线停顿,CPU可以更充分地利用流水线的并行性和吞吐量,提高指令的执行效率,加快计算阶乘的速度。

---

但是需要注意,展开循环也会增加代码量,可能会导致代码膨胀和缓存不命中等问题,因此在选择是否展开循环时需要综合考虑代码大小、缓存使用情况以及具体的计算规模来做出决策。

1.3.介绍一下 cup的指令流水线

CUP(Control Unit Pipeline)是计算机的一种指令流水线执行方式。它将计算机的指令执行过程分为多个阶段,并且每个阶段由一个专门的硬件单元来处理。这种流水线执行方式可以提高计算机的效率和性能。

CUP的指令流水线一般包括以下几个阶段:

  1. 取指令阶段(Instruction Fetch):从指令存储器中读取下一条指令,并将其送入指令译码器。

  2. 指令译码阶段(Instruction Decode):将指令译码为包含操作码和操作数的控制信号。

  3. 执行阶段(Execution):根据控制信号执行指令中的操作,并产生需要的结果。

  4. 访存阶段(Memory Access):如果指令需要访问内存,则进行内存读取或写入操作。

  5. 写回阶段(Write Back):将执行结果写回到寄存器文件或存储器中。

CUP的指令流水线可以并行地执行多条指令,从而实现指令的重叠执行。当一条指令在某个阶段执行时,下一条指令可以开始在前一个阶段进行处理。这样可以大大缩短指令的执行时间,提高计算机的吞吐量。

然而,CUP的指令流水线也存在一些问题。例如,由于指令之间可能存在数据依赖关系,需要进行冒险(Hazard)处理;还可能存在控制依赖问题,需要进行分支预测等。因此,在设计CUP指令流水线时,需要考虑这些问题,并采取相应的策略来解决。

xxx

https://rcwap.com/newsdetail_630.html

【性能】【算法】for循环,性能提高,算法,java,java,算法,CPU

=======

■实际运用

1.求和

代码

package com.sxz.study.alogrithm;

public class TestAlogrithom {

	public static void main(String[] args) {

		long timeBegin = 0;
		long timeEnd =0;
		
		
		timeBegin = System.currentTimeMillis();
		long result1 = calc001(1000000000);
		System.out.println(result1);
		timeEnd = System.currentTimeMillis();
		System.out.println(timeEnd-timeBegin);
		
		timeBegin = System.currentTimeMillis();
		long result2 = calc002(1000000000);
		System.out.println(result2);
		timeEnd = System.currentTimeMillis();
		System.out.println(timeEnd-timeBegin);
		
	}

	public static long calc001(int sumNumber) {
		long count = 0;

		for (int i = 1; i <= sumNumber; i++) {
			count += i;
		}

		return count;

	}

	public static long calc002(int sumNumber) {
		long count1 = 0, count2 = 0, count3 = 0, count4 = 0;
		
		// 假设,sumNuber 是4的倍数
		for (int i = 1; i <= sumNumber; i+=4) {
			count1 += i;
			count2 += i+1;
			count3 += i+2;
			count4 += i+3;
		}

		return count1 + count2 + count3 + count4;

	}
	
	

}

结果  

性能提高 了近14% (299258

(299-258)/ 299 = 13.71%

299 / 258 =1.1589

改善后,速度是之前的1.16倍

500000000500000000
299
500000000500000000
258

----------------------

2.求阶乘 (性能提高效果明显)

代码

package com.sxz.study.alogrithm;
 
import java.math.BigDecimal;
 
public class TestAlogrithom2 {
 
	public static void main(String[] args) {
 
		long timeBegin = 0;
		long timeEnd =0;
		
		
		timeBegin = System.currentTimeMillis();
		BigDecimal result1 = calc001(10000);
		System.out.println(result1);
		timeEnd = System.currentTimeMillis();
		System.out.println((timeEnd-timeBegin)+"ms");
		
		timeBegin = System.currentTimeMillis();
		BigDecimal result2 = calc002(10000);
		System.out.println(result2);
		timeEnd = System.currentTimeMillis();
		System.out.println((timeEnd-timeBegin)+"ms");
		
	}
 
	public static BigDecimal calc001(int sumNumber) {
		BigDecimal count = new BigDecimal(1);
 
		for (int i = 1; i <= sumNumber; i++) {
			count = count.multiply(new BigDecimal(i));
		}
 
		return count;
 
	}
 
	public static BigDecimal calc002(int sumNumber) {
		BigDecimal count1 = new BigDecimal(1);
		BigDecimal count2 = new BigDecimal(1);
		BigDecimal count3 = new BigDecimal(1);
		BigDecimal count4 = new BigDecimal(1);
		
		
		
		// 假设,sumNuber 是4的倍数
		for (int i = 1; i <= sumNumber; i+=4) {
			count1 = count1.multiply(new BigDecimal(i));
			count2 = count2.multiply(new BigDecimal(i+1));
			count3 = count3.multiply(new BigDecimal(i+2));
			count4 = count4.multiply(new BigDecimal(i+3));
		}
 
		return count1.multiply(count2).multiply(count3).multiply(count4);
 
	}
	
	
 
}

结果

性格提高了近69%%  (92 ⇒ 29)

(92-29)/ 2 = 68.47

92/29 = 3.17

改善后,速度是之前的三倍。

2846..........0000
92
2846..........0000
29

===

测试电脑性能

自己电脑

小米 笔记本 Pro 点击excel 文件夹 未响应 卡死 如何解决_小米笔记本文件夹未响应-CSDN博客

【性能】【算法】for循环,性能提高,算法,java,java,算法,CPU

==文章来源地址https://www.toymoban.com/news/detail-816932.html

【性能】【算法】for循环,性能提高,算法,java,java,算法,CPU

命令行执行

堆内存并非越大,效率越高!!!!!!

【性能】【算法】for循环,性能提高,算法,java,java,算法,CPU

==

电脑001

【性能】【算法】for循环,性能提高,算法,java,java,算法,CPU

电脑002(虚拟机,公用一个cup)

70~110,30~60

媳妇的电脑

chcp 65001

javac -encoding UTF-8 -d . TestAlogrithom2.java

java com.sxz.study.alogrithm.TestAlogrithom2 | findstr "ms"

java -Xms2g com.sxz.study.alogrithm.TestAlogrithom2 | findstr "ms"

【性能】【算法】for循环,性能提高,算法,java,java,算法,CPU

堆内存并非越大,效率越高!!!!!!!

指定堆内存 2g(-xms2g)

78,31

指定堆内存 256m(-xms256m)

78,16

不指定堆内存

79,15

====

爸爸的电脑

xx

==

到了这里,关于【性能】【算法】for循环,性能提高的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java循环对比:传统for循环、增强型for循环和forEach循环

    传统的for循环是一种经典的循环结构,在Java中广泛使用。 以下是传统for循环的特点: 灵活控制:传统for循环使用形式为for (初始化表达式; 终止条件; 步进表达式)的语法,可以手动控制循环的索引,并根据需要执行自定义操作。 索引访问:传统for循环通过索引访问集合或数

    2024年02月07日
    浏览(40)
  • Java循环方式对比:增强型for循环、传统for循环和Lambda表达式for循环

    在Java编程中,循环是一种重要的控制结构,用于迭代遍历集合或数组。Java提供了多种循环方式,其中包括增强型for循环、传统for循环和Lambda表达式for循环。本篇博客将对这三种循环方式进行对比,探讨它们的语法、特性和适用场景,帮助读者在不同情况下选择最合适的循环

    2024年02月05日
    浏览(47)
  • 【Java 基础】for 循环、嵌套循环详解(附案例)

    《 Java 零基础入门到精通 》 专栏持续更新中。通过本专栏你将学习到 Java 从 入门 到 进阶 再到 实战 的全套完整内容,所有内容均将集中于此专栏。无论是初学者还是有经验的开发人员,都可从本专栏获益。 订阅专栏后添加我微信或者进交流群,进群可找我领取 前端/Java

    2023年04月08日
    浏览(43)
  • java 增强for循环

    学的不是技术,更是梦想!!!

    2024年02月14日
    浏览(36)
  • Java中的for循环

        for循环是Java程序中设计使用最多的循环语句之一。一个for循环可以用来重复执行某个语句直到条件得到满足。 在Java中,for是一种,是一种循环结构的引导词 代码如下: 在这个例子中,x是循环的变量,它被初始化为0,每次循环x加1直到x10,而x加1也可以写成x++;这

    2024年02月12日
    浏览(36)
  • java for循环内部使用线程

    2024年02月06日
    浏览(38)
  • 【Java编程教程】详解 Java for 循环语句

    Java for 循环用于多次迭代程序的一部分。如果迭代次数固定,建议使用for循环。 Java 中有三种类型的 for 循环。   简单的 for 循环 For-each或增强型 for 循环 标记为循环 一个简单的 for 循环与C / C++相同。我们可以初始化变量,检查条件和递增/递减值。它由四个部分组成: 初始

    2024年02月08日
    浏览(52)
  • 深入理解 Java 循环结构:while、do while、for 和 for-each 循环

    循环可以执行一个代码块,只要达到指定的条件。循环很方便,因为它们节省时间,减少错误,并使代码更易读。 while 循环会循环执行一个代码块,只要指定的条件为真: 语法 在下面的示例中,只要变量(i)小于 5,循环中的代码将一遍又一遍地运行: 示例 注意:不要忘

    2024年02月19日
    浏览(39)
  • JAVA多线程处理for循环数据

    对for循环内数据启用多线程执行,主线程与子线程无先后顺序 执行结果: 对for循环内数据启用多线程执行,主线程在所有子线程执行完成之后执行 执行结果: 对for循环内数据启用多线程执行,主线程在所有子线程执行完成之后执行 执行结果: 4. JAVA多线程10个线程处理100

    2024年02月11日
    浏览(54)
  • 【java】几种跳出 for循环的方法

    在Java中,有多种方法可以跳出 for 循环,从而停止循环的执行。以下是其中的三种常见的方法: 当 i 等于5时, break 语句会将控制流程跳出 for 循环从而停止后续代码的执行。 当 i 等于5时, return 语句会立即退出整个方法从而停止对 for 循环的执行。 当 i 等于5时, continue 语

    2024年02月07日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包