loopvar 改动不同版本的影响-大循环的执行时间

2024-04-03 03:36

本文主要是介绍loopvar 改动不同版本的影响-大循环的执行时间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

示例代码

package mainimport ("fmt""runtime""time"
)type Large [1 << 12]bytefunc readOnly(x *Large, k int) {}
func foo() {for a, i := (Large{}), 0; i < len(a); i++ {readOnly(&a, i)}
}
func bench() time.Duration {start := time.Now()foo()return time.Since(start)
}
func main() {fmt.Println("golang version:", runtime.Version())fmt.Println("elapsed time:", bench())
}

代码说明

代码定义foo方法,循环了一个长度有4k的slice,readonly是一个空方法,只是为了演示用的,bench为计算循环执行时长的方法

golang 1.21的运行结果

go run demo/large_for.go
golang version: go1.21.5
elapsed time: 1.202µs

可以看到在golang 1.21.5的版本中执行的时间是1.2us,在1.22中执行时间是会变长还是变短呢?

golang 1.22的运行结果

go run demo/large_for.go
golang version: go1.22.1
elapsed time: 754.581µs

是不是很吃惊,1.22居然用了784us,比1.21的执行时间要长了很多倍。

下面我们定义一个长度为1000的struct,然后遍历这个struct。看下执行的时间.

package mainimport ("fmt""runtime""time"
)type Person struct {Name   stringAge    uint8Sex    stringHeight uint8
}var Large [1000]Personfunc readOnly(x *Person, k int) {}func foo() {for i, l := range Large {readOnly(&l, i)}
}
func bench() time.Duration {start := time.Now()foo()return time.Since(start)
}
func main() {fmt.Println("golang version:", runtime.Version())fmt.Println("elapsed time:", bench())
}

golang 1.21的结果

go run demo/large1_for.go
golang version: go1.21.5
elapsed time: 26.268µs

golang 1.22的结果

go run demo/large1_for.go
golang version: go1.22.1
elapsed time: 27.215µs

单次运行的结果发现1.21和1.22的消耗的时间是差不多的。
为什么第一个例子中1.22执行的时间长,1.21执行的时间短呢,因为1.21 for loop的变量只初始化一次,但是1.22 for loop的变量每次循环都会创建新的变量。因为在1.22的版本中不要在for loop中执行大尺寸的变量赋值

这篇关于loopvar 改动不同版本的影响-大循环的执行时间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)

《JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)》本文介绍了如何在Windows系统上配置多版本JDK(以JDK8和JDK17为例),并通过图文结合的方式给大家讲解了详细步骤,具有... 目录第一步 下载安装JDK第二步 配置环境变量第三步 切换JDK版本并验证可能遇到的问题前提:公司常