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

目录

■提高性能的方法

・原理

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

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

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

■实际运用

1.求和

代码

结果  

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

代码

结果

测试电脑性能

自己电脑

电脑001

电脑002

媳妇的电脑

爸爸的电脑


====

■提高性能的方法

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

(算法,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.求和

代码

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);timeBegin = System.currentTimeMillis();BigDecimal result2 = calc002(10000);System.out.println(result2);timeEnd = System.currentTimeMillis();System.out.println(timeEnd-timeBegin);}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

xxx

媳妇的电脑

xx

爸爸的电脑

xx

==

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/607384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Debezium发布历史56

原文地址&#xff1a; https://debezium.io/blog/2019/05/23/tutorial-using-debezium-connectors-with-apache-pulsar/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 将 Debezium 连接器与 Apache Pulsar 结合…

笔试案例2

文章目录 1、笔试案例22、思维导图 1、笔试案例2 09&#xff09;查询学过「张三」老师授课的同学的信息 selects.*,c.cname,t.tname,sc.score from t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc where t.tidc.cid and c.cidsc.cid and sc.sids…

简洁大气带进度条的URL跳转页面HTML源码

源码介绍 简洁大气带进度条的URL跳转页面HTML源码&#xff0c;记事本修改里面的内容即可&#xff0c;喜欢的同学可以拿去使用 获取方式&#xff1a; 蓝奏云&#xff1a;https://wfr.lanzout.com/ic1iZ1kj6yde CSDN免积分下载:https://download.csdn.net/download/huayula/88…

Java桶排序、基数排序、剪枝算法

桶排序算法 桶排序的基本思想是&#xff1a; 把数组 arr 划分为 n 个大小相同子区间&#xff08;桶&#xff09;&#xff0c;每个子区间各自排序&#xff0c;最后合并 。计数排序是桶排序的一种特殊情况&#xff0c;可以把计数排序当成每个桶里只有一个元素的情况。 1.找出待…

答疑解惑:核技术利用辐射安全与防护考核

前言 最近通过了《核技术利用辐射安全与防护考核》&#xff0c;顺利拿到了合格证。这是从事与辐射相关行业所需要的一个基本证书&#xff0c;考试并不难&#xff0c;在此写篇博客记录一下主要的知识点。 需要这个证书的行业常见的有医疗方面的&#xff0c;如放疗&#xff0c;…

黑马苍穹外卖学习Day3

目录 公共字段自动填充问题分析实现思路代码实现 新增菜品需求分析和设计接口设计代码开发开发文件上传接口功能开发 菜品分页查询需求分析和设计代码开发 菜品删除功能需求分析与设计代码实现代码优化 修改菜品需求分析和设计代码实现 公共字段自动填充 问题分析 员工表和分…

静态网页设计——崩坏3(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; 使用技术&#xff1a;HTMLCSSJS&#xff08;静态网页设计&#xff09; 主要内容&#xff1a;对游戏崩坏3进行简单介绍。 https://www.bilib…

【Linux进程】查看进程fork创建进程

目录 前言 1. 查看进程 2. 通过系统调用创建进程-fork初识 总结 前言 你有没有想过在使用Linux操作系统时&#xff0c;后台运行的程序是如何管理的&#xff1f;在Linux中&#xff0c;进程是一个非常重要的概念。本文将介绍如何查看当前运行的进程&#xff0c;并且讨论如何使用…

将项目同时提交到GitHub和码云Gitee上面,GitHub与Gitee同步

多个远程仓库同时使用 新建GitHub仓库 创建成功 在终端中创建仓库 如果你想在本地机器上创建Git仓库&#xff0c;或者想添加一个文件夹或文件到已经存在的Git仓库中&#xff0c;你应该在终端中创建你的Git仓库。在你可以通过终端来创建一个Git仓库。以下是在终端中创建Git仓…

java解析json复杂数据的第三种思路

文章目录 一、概述二、数据预览1. 接口json数据2. json转xml数据 三、代码实现1. pom.xml2. 核心代码3. 运行结果 四、源码传送 一、概述 接上篇 java解析json复杂数据的两种思路 我们已经通过解析返回json字符串得到数据,现在改变思路, 按照如下流程获取数据: #mermaid-svg-k…

AcrelCloud-3000环保用电监管云平台解决方案——安科瑞赵嘉敏

概述 国家全面推进打赢蓝天保卫战&#xff0c;打好碧水保卫战&#xff0c;打胜净土保卫战&#xff0c;加快生态环境保护、建设美丽中国。环保用电监管系统针对企业内的环保设施、设备运行状况进行检测&#xff0c;发挥环保设备的作用&#xff0c;提高监察效率&#xff0c;并为…

洛谷 P1217 [USACO1.5] 回文质数 Prime Palindromes 刷题笔记

P1217 [USACO1.5] 回文质数 Prime Palindromes - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 直接枚举 减枝优化判断 优化1 只有偶数才会是质数 优化2 回文数的判断次数要优于检查素数 先判断是否为回文数再检查是否为质数 if( hw(i)&&isprime(i)) 这里…

Springcloud Gateway网关

简介 SpringCloud Gateway是基于WebFlux框架实现的&#xff0c;而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。 Spring Cloud Gateway的目标提供统一的路由方式且基于 Filter链的方式提供了网关基本的功能&#xff0c;例如:安全&#xff0c;监控/指标&#xf…

lv14 IO模型:阻塞和非阻塞 7

1 五种IO模型------读写外设数据的方式 阻塞: 不能操作就睡觉 非阻塞&#xff1a;不能操作就返回错误(通过轮询即才能实现阻塞的情况 &#xff09; 多路复用&#xff1a;委托中介监控 信号驱动&#xff1a;让内核如果能操作时发信号&#xff0c;在信号处理函数中操作 异步IO&a…

ES6(一部分)未完...

文章目录 ES61.ES6 let声明变量2.ES6 const声明常量3.变量解构赋值3-1解构对象3-2解构数组3-3字符串解构 4.模板字符串5.字符串扩展5-1 include函数5-2 repeat函数&#xff08;重复&#xff09; 6.数值扩展6-1二进制和八进制表示法6-2isFinite 与 isNaN方法6-3islnteger方法6-4…

Vue3+TS+Vite 构建自动导入开发环境

关注⬆️⬆️⬆️⬆️ 专栏后期更新更多前端内容 在一个使用 Vue 3、Vite 和 TypeScript 的项目中,配置 unplugin-auto-import 和 unplugin-vue-components 插件可以极大地提高开发效率,因为它们可以自动导入 Vue 相关的 API 和 Vue 组件,从而减少了手动导入的需要。 文章目…

FPGA UDP协议栈:基于88E1111,支持RGMII、GMII、SGMII三种模式,提供3套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的以太网方案本协议栈的 1G-UDP版本本协议栈的 10G-UDP版本本协议栈的 25G-UDP版本1G 千兆网 TCP-->服务器 方案1G 千兆网 TCP-->客户端 方案10G 万兆网 TCP-->服务器客户端 方案 3、该UDP协议栈性能4、详细设计方案设…

Hyperledger Fabric 消息协议

Fabric 中大量采用了 gRPC 消息在不同组件之间进行通信交互&#xff0c;主要包括如下几种情况&#xff1a;客户端访问 Peer 节点&#xff0c;客户端和 Peer 节点访问排序节点&#xff0c;链码容器与 Peer 节点交互&#xff0c;以及多个 Peer 节点之间的 Gossip 交互。 消息结构…

Android 架构 - 模块化

参考文章 谷歌官方指南 一、概念 将大型、复杂问题拆解成一个个小的、简单问题&#xff0c;从而可以做到各个击破。模块化简单讲就是把多功能高耦合的代码逻辑拆散成多个功能单一职责明确的模块。模块指 Android 项目中的 module&#xff0c;通常会包含 Gradle 构建脚本、源代…

【Android Studio】创建第一个APP工程及生成APK安装包

&#x1f31f;博主领域&#xff1a;嵌入式领域&人工智能&软件开发 前言&#xff1a;本文详细介绍创建Android Studio第一个APP工程及打包生成APK安装包。 如下两个博客我记录了第一次创建项目时出现的问题&#xff0c;若你也遇见了同样的问题&#xff0c;可参考&#…