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中执行大尺寸的变量赋值

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

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

相关文章

【机器学习】机器学习创建算法第3篇:K-近邻算法,学习目标【附代码文档】

机器学习&#xff08;算法篇&#xff09;完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;机器学习算法课程定位、目标&#xff0c;K-近邻算法定位,目标,学习目标,1 什么是K-近邻算法,1 Scikit-learn工具介绍,2 K-近邻算法API。K-近邻算法&#xff0c;1.4 …

GT收发器PHY层设计(2)GT_module模块设计

文章目录 前言一、设计框图二、例化IP核端口三、common_reset_i模块四、gt_usrclk_source模块五、IBUFDS_GTE2和gtwizard_0_common模块六、顶层模块gt_module总结 前言 根据官方的example design设计一个自定义协议的高速PHY设计 一、设计框图 设计思路及代码思路参考FPGA奇哥…

【算法】字符串查询KMP算法代码实现

原理&#xff1a; 不回溯主串&#xff0c;通过计算步长后移子串的方式快速查找字符串&#xff0c;将时间复杂度控制到O(n)。 主要原理是&#xff0c;先在子串中找到所有重复的更小子串&#xff0c;并在重复的后面的子串的最后一位的下标记录子串长度。当与主串匹配出现不一致时…

SpringBoot快速实现发送邮件

1、添加发送邮件需要的maven依赖 在 pom.xml 配置文件中加入 spring-boot-starter-mail 依赖。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId> </dependency>2、添加邮箱配…

单源最短路径

题目描述 给定一个 n 个点&#xff0c;m 条有向边的带非负权图&#xff0c;请你计算从 s 出发&#xff0c;到每个点的距离。 数据保证你能从 s 出发到任意点。 输入格式 第一行为三个正整数n,m,s。 第二行起 m 行&#xff0c;每行三个非负整数 ui​,vi​,wi​&#xff0c;表…

关于v114之后的chromedriver及存放路径

使用selenium调用浏览器时&#xff0c;我一直调用谷歌浏览器&#xff0c;可浏览器升级后&#xff0c;就会再次遇到以前遇到过的各种问题&#xff0c;诸如&#xff1a;1、怎么关闭浏览器更新&#xff1b;2、去哪儿下载chromedriver&#xff1b;3、114版本之后的驱动去哪儿下载&a…

【御控物联】JavaScript JSON结构转换(11):数组To数组——综合应用

文章目录 一、JSON结构转换是什么&#xff1f;二、术语解释三、案例之《JSON数组 To JSON数组》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换&#xff0…

golang语言系列:golang基础知识

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 golang语言 系列文章&#xff0c;本节会对 golang 基础知识进行学习。gitee有个知识库https://gitee.com/yooome/golang&#xff0c;golang基础知识整理的非常详细了&#xff0c;本文直接链接到该git 0_Go语言的…

蓝桥杯真题:单词分析

import java.util.Scanner; //1:无需package //2: 类名必须Main, 不可修改 public class Main{public static void main(String[]args) {Scanner sannernew Scanner(System.in);String strsanner.nextLine();int []anew int [26];for(int i0;i<str.length();i) {a[str.charA…

记录几个常用命令

目录 一、查询历史命令 二、启动java容器 三、启动java容器并联通mysql容器 一、查询历史命令 # 查出所有"docker run"的历史命令 history | grep "docker run" 二、启动java容器 docker run -itd --name atcc-door -v /home/wwwroot/atcc-door:/hom…

基于蚁群算法的三维路径规划(matlab实现)

作品简介 1 理论基础 1.1 三维路径规划问题概述 三维路径规划指在已知三维地图中&#xff0c;规划出一条从出发点到目标点满足某项指标最优&#xff0c;并且避开了所有三维障碍物的三维最优路径。现有的路径规划算法中&#xff0c;大部分算法是在二维规划平面或准二维规划平面…

分享一种快速移植OpenHarmony Linux内核的方法

移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开发者&#xff0c;介绍一种借助三方芯片平台自带 Linux 内核的现有能力&#xff0c;快速移植 OpenHarmony 到三方芯片平台的方法。 移植到三方芯片平台的整体思路 内核态层和用户态层 为了更好的解释整个内核…

HP Z440不重启进入bios,在服务器系统里修改bios的配置

HP Z440不重启进入bios&#xff0c;在服务器系统里修改bios的配置 在某些情况下&#xff0c;你可以在不重启并进入BIOS/UEFI设置界面的情况下&#xff0c;直接从操作系统内部修改BIOS配置。这通常通过特定的软件工具实现&#xff0c;这些工具能够与系统的固件层进行交云&#…

校园跑腿的含义是什么?大学里校园跑腿的特点有哪些?

校园跑腿是指校园内的一种学生间互助服务活动&#xff0c;即学生通过平台发布需求&#xff0c;由其他学生以跑腿的方式提供相应服务&#xff0c;以获取服务费。这种服务模式为需求者提供便利&#xff0c;同时也为提供服务的学生带来一定的收入。 大学里校园跑腿的特点主要有以…

git实战教程

Git实战教程涵盖了Git的基本操作以及如何在日常开发中高效地使用Git进行版本控制。以下是一些Git实战的基础操作步骤&#xff0c;以帮助您快速入门和熟悉Git的使用&#xff1a; ### Git基础操作流程 1. **安装Git** - 下载并安装适用于您操作系统的Git客户端&#xff0c;比…

若依分离版 —引入echart连接Springboot后端

1. vue引入echart &#xff08;1&#xff09;首先安装ECharts库。可以通过npm npm install echarts --save &#xff08;2&#xff09;在vue页面中添加一个容器元素来显示图表 <el-card class"mt20"><div id"ha" ref"main"><…

六、保持长期高效的七个法则(二)Rules for Staying Productive Long-Term(2)

Rule #5 - If your work changes, your system should too. 准则五&#xff1a;如果你的工作变了&#xff0c;你的系统也应该改变。 For some, work will be consistent enough to not need major changes.You simply stick to the same system and you’ll get the results y…

fbx smpl转换

目录 3.7 3.8版本&#xff1a; c sdk 3.9 自己编译 下面的库和代码结合 测试ok 大神编译了各个版本 smpl转fbx windows 可行代码 3.7 3.8版本&#xff1a; https://github.com/Shiiho11/FBX-Python-SDK-for-Python3.x c sdk vs2019 https://www.autodesk.com/develop…

openGauss 分区

分区 可获得性 本特性自openGauss 1.1.0版本开始引入。 特性简介 数据分区是在一个节点内部对数据按照用户指定的策略做进一步的水平分表&#xff0c;将表按照指定范围划分为多个数据互不重叠的部分。 客户价值 对于大多数用户使用场景&#xff0c;分区表和普通表相比具有…

【Spring】SpringBoot整合MybatisPlus的基本应用

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、MybatisPlus简介 先来看一下官方的简介吧。 MyBatis-Plus &#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为 简化开发、提高效率而生。Myb…