【小测试】golang中数组边界检查的开销大约是1.87%~3.12%
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
对比C/C++, golang等类型安全的语言会在数组访问的代码前,通过编译器加入边界检查的代码。
当发生越界的时候,引发panic,而不是实际发生越界导致的结果异常甚至程序崩溃。
因此,本实验通过对比有边界检查和无边界检查的情况,对比边界检查带来的性能开销:
// 有边界检查的情况
func Benchmark_arr_range_check_1(b *testing.B) {
arr := make([]byte, 1024*1024)
index := make([]int, 1024*32)
for i := 0; i < len(index); i++ {
index[i] = rand.Intn(len(arr))
}
b.ResetTimer()
for n := 0; n < b.N; n++ {
for i := 0; i < len(index); i++ {
arr[index[i]]++ //普通的数组访问,每次访问数组的耗时大约是 1.44ns
}
}
}
// 无边界检查的情况
func Benchmark_arr_range_check_2(b *testing.B) {
arr := make([]byte, 1024*1024)
index := make([]int, 1024*32)
for i := 0; i < len(index); i++ {
index[i] = rand.Intn(len(arr))
}
b.ResetTimer()
for n := 0; n < b.N; n++ {
for i := 0; i < len(index); i++ {
offset := index[i]
(*(*byte)(unsafe.Pointer(uintptr(unsafe.Pointer(&arr[0])) + uintptr(offset))))++ // 通过unsafe代码来绕过边界检查,每次数组访问耗时大约 1.41ns
}
}
}
- 总结:
- 当涉及大量数组访问的场合,比如很大的定长 local cache的情形,可以通过unsafe去掉边界检查
- 当某个算法使用查表法来获取数据,适合去掉边界检查
【小测试】golang中数组边界检查的开销大约是1.87%~3.12%的更多相关文章
- 🏆【Java技术专区】「编译器专题」重塑认识Java编译器的执行过程(消除数组边界检查+公共子表达式)!
前提概要 Java的class字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令.这个过程是Java虚拟机做的,这个过程也叫编译.是更深层次的编译. 在编译原理中,把源代码翻译成机 ...
- golang中数组指针与指针数组的区别实现
指针数组和数组的指针,指的是两个不同的东西. 指针数组是有指针组成的数组,数组的指针是一个数组的指针. package main import "fmt" const MAX ...
- golang中数组与切片的区别
初始化:数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变 数组: a := [...],,} a := [],,} 切片: a:= [],,} a := make([]) a := m ...
- golang中数组指针和指针数组的区别
func test(){ x,y := 1, 2 var arr = [...]int{5:2} //数组指针 var pf *[6]int = &arr //指针数组 pfArr := [. ...
- golang中数组指针和指针数组当做函数参数如何修改数组中的值
先理解:数组指针它的类型时指针,指针数组它的类型时数组 1. 数组指针当做函数的参数 package main import "fmt" func changeData(dataA ...
- Golang 入门 : 数组
数组是指一系列同一类型数据的集合.数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如 int.string 等,也可以是用户自定义的类型.一个数组包含的元素个数被 ...
- [转]Golang 中使用 JSON 的小技巧
taowen是json-iterator的作者. 序列化和反序列化需要处理JSON和struct的关系,其中会用到一些技巧. 原文 Golang 中使用 JSON 的小技巧是他的经验之谈,介绍了一些s ...
- golang中mysql建立连接超时时间timeout 测试
本文测试连接mysql的超时时间. 这里的"连接"是建立连接的意思. 连接mysql的超时时间是通过参数timeout设置的. 1.建立连接超时测试 下面例子中,设置连接超时时间为 ...
- 小程序中监听textarea或者input输入的值动态改变data中数组的对象的值
Page({ data: { todoLists:[ { detail:"", date:"", location:"", priority ...
- 小程序开发之改变data中数组或对象的某一属性值
前言:在小程序的开发中,我们在view中便利data中数组或对象时,很多情况下需要在js中动态改变数组或者对象中某一香的属性值. 效果图: 我给大家总结了案例如下: wxml如下: <scr ...
随机推荐
- 云小课 | DSC之数据水印,防止数据被盗用
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要: 华为云数据安全中 ...
- 数据飞轮拆解车企数据驱动三板斧:数据分析、市场画像、A/B 实验
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近日,火山引擎数智平台(VeDI)2023 数据飞轮汽车行业研讨会在上海举办,活动聚焦汽车行业数字化转型痛点,从字 ...
- Jmeter软件测试
1.1. 性能测试是什么 基于协议模拟用户发出请求,对服务器形成一定负载,来测试服务器的性能指标是否满足要求 性能指标关注点:时间性能.空间性能 性能测试与页面无关 性能测试定义:指通过自动化的测试工 ...
- CPU推理|使用英特尔 Sapphire Rapids 加速 PyTorch Transformers
在 最近的一篇文章 中,我们介绍了代号为 Sapphire Rapids 的第四代英特尔至强 CPU 及其新的先进矩阵扩展 (AMX) 指令集.通过使用 Amazon EC2 上的 Sapphire ...
- 解决延迟有 Wi-Fi 6 就够了!
最近二狗子家里的路由器坏了,而家里的数据网络信号又非常差,失去了路由器基本上就等于和世界隔离,所以二狗子打算去附近商城随便买一个新的路由器,结果售货员张口就问:"买 Wi-Fi 6 的路由器 ...
- java jar 注册成 windows 服务
1.去github上下载winsw https://github.com/winsw/winsw/releases 2.WinSW.NET4.xml <service> <id> ...
- vue学习笔记 一、环境搭建
系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...
- 改变函数内this指向方法——call、apply、bind
javascript为我们专门提供了一些函数方法来帮我们更优雅的处理函数内部this的指向问题,常用的有bind( ).call( ).apply( )三种方法. 相同点: 都可以改变函数内部的thi ...
- paddlespeech asr脚本demo
概述 paddlespeech是百度飞桨平台的开源工具包,主要用于语音和音频的分析处理,其中包含多个可选模型,提供语音识别.语音合成.说话人验证.关键词识别.音频分类和语音翻译等功能. 本文介绍利用p ...
- Angular系列教程之观察者模式和RxJS
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
