当前位置: 首页 > news >正文

GOLANG编码小技巧]对数组元素赋值时,先赋值尾部再赋值头部就会变快

性能非常强悍,我自己写的版本始终没干过它。(在我的新版推出以前)vtprotobuf 可以算是 golang 领域最快的 protobuf 库。

为什么我就比不过它呢?我看到了这样的看不懂的代码:

func (m *Child) MarshalToSizedBufferVT(dAtA []byte) (int, error) {
if m == nil {
return 0, nil
}
i := len(dAtA)
_ = i
var l int
_ = l
if len(m.ChildName) > 0 {
i -= len(m.ChildName)
copy(dAtA[i:], m.ChildName)
i = protohelpers.EncodeVarint(dAtA, i, uint64(len(m.ChildName)))
i–
dAtA[i] = 0x12
}
if m.ChildId != 0 {
i = protohelpers.EncodeVarint(dAtA, i, uint64(m.ChildId))
i–
dAtA[i] = 0x8
}
return len(dAtA) - i, nil
}
可以发现,这个库的特点是: 先对数组的尾部赋值,然后下标向前偏移,然后再对数组首部进行赋值。
难道这样就会变快?

Yes!
下面我就拆解一下变快的原因:

先看下面的两个函数:

func f1(arr []byte) {
arr[0] = 1
arr[9] = 2
}

func f2(arr []byte) {
arr[9] = 2
arr[0] = 1
}
功能完全一样,只是顺序不同。

下面用命令行来检查数组越界检查:

go tool compile -d=ssa/check_bce/debug=1 bce.go
可以发现:

func f1(arr []byte) {
arr[0] = 1 // 仍有 bounds check
arr[9] = 2 // 仍有 bounds check
}

func f2(arr []byte) {
arr[9] = 2 // 仍有 bounds check
arr[0] = 1 // 没有 Found,说明这个检查被消掉了
}
由此说明:如果先出现了比较大的下标,再出现小的下标,那么编译器就能推断后续的数组访问一定没越界,由此便不再产生越界检查的代码。

从 golang 源码本身也能发现证据:
Go 编译器源码证据主要在 cmd/compile/internal/ssa/prove.go。OpIsInBounds 表示

http://www.jsqmd.com/news/1217683/

相关文章:

  • Clang LTO实战指南:解锁C++跨模块性能优化的隐藏潜力
  • C++实现Windows开机自启动:从注册表到服务的完整指南
  • 2026年酒店非标工程定制灯具源头工厂推荐:名豹灯饰为何值得重点考察
  • C/C++编程入门:从Dev-C++环境搭建到实战项目
  • 串文脉察规划 观全域谋振兴——“溯源綦州,文脉寻踪”实践团走访綦江规划展览馆
  • Electron+Vue项目打包EXE完整指南
  • 深入OpenMP运行时库:从并行指令到底层性能调优实战
  • C++实战问题集:编译链接、内存管理、多线程与STL陷阱解决方案
  • 2026年论文党必备:AI智能降重工具深度测评与推荐
  • 51单片机IO扩展实战:74HC165应用与优化
  • MyBatis-Plus核心功能与Spring Boot集成实践
  • wsl中安装了图形ubuntu24.04,在语言中安装了中文,但是系统里还是英文
  • 解决DEVC++编译卡顿:杀毒软件实时防护与开发环境优化指南
  • TensorRT C++部署全流程:从ONNX模型到高性能GPU推理引擎
  • 如何设计一个 Agent 友好的 CLI 工具
  • 基于可穿刺WPRF的半自适应安全离线见证加密方案设计与实现
  • AM62L UART模块深度解析:从串口到多协议通信引擎的硬件与配置
  • BEV感知实战:从融合到纯视觉的五大核心模块代码解析
  • 电压力锅选购指南:核心参数解析与智能预约使用技巧
  • 解决Android模拟器进程被终止的常见问题
  • 嵌入式视觉系统核心:ISP数据路径与CSI接收器深度解析
  • 爆坑!Python读取Excel中文乱码、格式错乱?3行代码永久解决(亲测100%有效)
  • 数据叙事:让业务方听懂模型价值的五大工程支柱
  • 高效阅读方法论:提升知识获取与思维训练的技巧
  • 我让 AI 重构 5000 行 Java 代码,最后一周都在修它造的 Bug
  • Android定时器实现方案对比与优化实践
  • Android定时滚动功能实现与优化指南
  • Mooncake 学习路线
  • 多维聚合实战:破解GROUP BY在交叉分析中的失效困局
  • DSP开发实战:从芯片特性到工程优化技巧