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

目录

■提高性能的方法

・原理

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

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

[1.3.介绍一下 cup的指令流水线](#1.3.介绍一下 cup的指令流水线)

■实际运用

1.求和

代码

结果

[2.求阶乘 (性能提高效果明显)](#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

=======

■实际运用

1.求和

代码

java 复制代码
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% ( 299**⇒** 258**)**

(299-258)/ 299 = 13.71%

299 / 258 =1.1589

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

500000000500000000

299

500000000500000000

258


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

代码

java 复制代码
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博客

==

命令行执行

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

==

电脑001

电脑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"

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

指定堆内存 2g(-xms2g)

78,31

指定堆内存 256m(-xms256m)

78,16

不指定堆内存

79,15

====

爸爸的电脑

xx

==

相关推荐
Ven%21 小时前
【AI大模型算法工程师面试题解析与技术思考】
人工智能·python·算法
天勤量化大唯粉21 小时前
枢轴点反转策略在铜期货中的量化应用指南(附天勤量化代码)
ide·python·算法·机器学习·github·开源软件·程序员创富
waper9721 小时前
nohup java -jar启动jar包错报错 地址已在使用
java·开发语言·jar
無量21 小时前
ConcurrentHashMap实现原理
java·后端
Selegant21 小时前
Kubernetes + Helm + ArgoCD:打造 GitOps 驱动的 Java 应用交付流水线
java·kubernetes·argocd
ShadowSmartMicros21 小时前
java调用milvus数据库
java·数据库·milvus
禾高网络21 小时前
互联网医院系统,互联网医院系统核心功能及技术
java·大数据·人工智能·小程序
爱学习的小仙女!21 小时前
算法效率的度量 时间复杂度 空间复杂度
数据结构·算法
AndrewHZ21 小时前
【复杂网络分析】什么是图神经网络?
人工智能·深度学习·神经网络·算法·图神经网络·复杂网络
Swizard21 小时前
拒绝“狗熊掰棒子”!用 EWC (Elastic Weight Consolidation) 彻底终结 AI 的灾难性遗忘
python·算法·ai·训练