【小测试】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 ...
随机推荐
- Windows 清理C盘空间,将桌面,文档等移D盘
一般用户数据文件,缓存文件等,会默认放在C盘.而且有些程序必须装在C盘,久而久之,C盘空间越来越小,到后面没办法再安装使用一些程序. 可以将一些常用的移到D盘:特别是微信,动不动就几十个G的空间被占用 ...
- ChatGPT插件权限给Plus用户放开了
大家好,我是章北海mlpy ChatGPT插件权限给Plus用户放开了 我稍微测试了俩,感觉还行,后续我会对一些热门插件深入测测,敬请期待. 官方对插件的介绍如下: 1.插件由非由OpenAI控制的第 ...
- 【Django drf】认证类 权限类 频率类 过滤类 排序类 分页类
目录 认证类 前期准备 自定义认证类 配置认证类 全局配置 局部禁用 认证组件使用步骤 基于类中方法的认证(了解) 权限类 前期准备 重写has_permission() 添加权限不足信息 权限组件使 ...
- Gcc内置原子操作__sync_系列函数
Gcc内置原子操作__sync_系列函数简述及例程 Gcc 4.1.2版本之后,对X86或X86_64支持内置原子操作.就是说,不需要引入第三方库(如pthread)的锁保护,即可对1.2.4.8字节 ...
- vi / vim 键盘图(清晰打印版,桌面背景好图)
PDF File https://files.cnblogs.com/files/RioTian/vivim-graphical.zip?t=1704439837&download=true ...
- Java | Spring Boot统一日志框架
在项目开发中,日志十分的重要,不管是记录运行情况还是定位线上问题,都离不开对日志的分析.在 Java 领域里存在着多种日志框架,如 JCL.SLF4J.Jboss-logging.jUL.log4j. ...
- #2037:今年暑假不AC
Problem Description "今年暑假不AC?" "是的." "那你干什么呢?" "看世界杯呀,笨蛋!" & ...
- Codeforece : 1360C. Similar Pairs(水题)
https://codeforces.com/contest/1360/problem/C We call two numbers xx and yy similar if they have the ...
- HDU - 1560:DNA sequence ( 迭代加深搜索基础题 )
Problem Description The twenty-first century is a biology-technology developing century. We know tha ...
- 骨牌摆放问题 POJ 2411(状态压缩DP)
题目: 给你\(n*m(1<=n,m<=11)\)的方格矩阵,要求用1*2的多米诺骨牌去填充,问有多少种填充方法. 比如下图是对于如下2x6的方格矩阵,可能的填充方案之一. 该如何使用动态 ...
