大家好,我是煎鱼。

目前 Go 的泛型已经在稳定推进的过程,在 Go1.18 将会释出正式的第一版。不过前两天我看到 @danscales 提出的《cmd/compile: Go 1.18 compile time may be about 18% slower than Go.17 (largely from changes due to generics)》。

作者表示在 Go1.18 有了泛型后,编译速度可能会变慢,虽然不意外,说明泛型的副作用还是有的,大家后续升级需谨慎。

以下为修整后概括的原文信息。

性能分析

这个测试主要是测试 Go 泛型对 Go 编译器带来的影响,并没有输入大量的测试用例,是最简单的比较,仅代表大部分的差异。

比较的内容是 Go 泛型的 -G=0 和 -G=3 模式下的编译时间。

分别代表以下含义:

  • -G=0 模式:默认不打开泛型的模式。

  • -G=3 模式:打开泛型的模式。

Go 1.18 中的 -G=0 模式和 Go 1.17 模式的比较显示,由于非泛型的变化,编译器的速度可能降低了~1%(因为 -G=0 模式不支持泛型)。

Go 1.18 的编译时间可能比 Go 1.17 慢 15-18%,这主要是由于实现泛型所带来的变化,也就是 Go1.18 开启泛型下,编译时间会变慢。

差异在哪

大部分的差异是由于新的编译器前端处理,因为 SSA 后端对于泛型完全没有变化。

  • 在 -G=0 模式下(用于 Go 1.18 之前的所有编译器):有一个语法分析器,创建 ir.Node 节点树的 noder 阶段,以及标准类型检查器。

  • 在 -G=3 模式下:有相同的语法分析器,但程序首先由 types2(支持泛型)进行类型检查。

在通过 -G=3 模式打开泛型后,会有一个 noder2 阶段,使用语法信息和 types2 类型检查器的类型信息创建 ir.Node 节点树。

在一次运行中,noder+ types1-typechecking 的开销总和约为 4%,而 types2-typechecker+noder2 的总和为 14%。

经过分析,可以得到大部分的速度下降是由于改变了编译前端处理(并不意外)。

总结

可以明确的是,在打开泛型后,Go1.18 编译时间可能会慢 15-18%,Go 官方将计划在 Go 1.19 中减少这种额外的开销。所以已经不是 “可能”,是必然了。

泛型的双刃剑初见,后续不管是编译时间、执行时间(预计不会减缓)、泛型的滥用、最佳实践等,都值得我们去讨论和关注。

看来引入泛型后要经历一轮修整了,毕竟 Go 语言是以编译速度快著称...欢迎大家在评论区讨论和交流:)

关注煎鱼,吸取他的知识

泛型是双刃剑?Go1.18 编译会慢近 20%相关推荐

  1. Go1.18泛型使用详解(附最新gocode)

    原文地址:Go1.18版本泛型详解_耀一世风光的博客-CSDN博客_go 泛型go1.18泛型详解https://blog.csdn.net/qq_52582768/article/details/1 ...

  2. Go1.18 新特性:多模块(Multi-Module)工作区模式

    文章目录 背景 举例:未发布的 module Go1.18 新特性:多模块(Multi-Module)工作区模式 Go1.18 工作区模式 初始化一个新的工作区 go work use 添加新的模块到 ...

  3. Go1.18 新特性:多 Module 工作区模式

    Go 的依赖管理,也就是 Go Module.从推出到现在,也已经有了一定的年头了,吐槽一直很多,官方也不断地在进行完善. Go1.18 将会推出一个新特性:Multi-Module Workspac ...

  4. 笔记整理4----Java语言高级(四)16 JAVA常用API-高级+17 泛型与常见数据结构+18 Map与Set集合+19 异常处理+20 IO流-高级

    16 JAVA常用API-高级+17 泛型与常见数据结构+18 Map与Set集合+19 异常处理+20 IO流-高级 第05天 API 今日内容介绍  Object类 & System类 ...

  5. 对于升级go1.18的goland问题

    截止目前,go1.18 已经发布了22 天,当前有很多的小伙伴已经在使用最新的版本,尝试着各种解锁新姿势. 但是更新之后,在goland中打开发现全是报错,是不是怀疑自己打开的方式不对? 报错:'ma ...

  6. Go1.18 新特性:引入新的 netip 网络库

    大家好,我是煎鱼. 写这篇文章时是大年初一,原本想说这个月就要发布 Go1.18 了.但是,好家伙,Go1.18 beta2 发布了,官方告知社区 Go1.18 要拖更到 3 月份了,咕咕咕... 如 ...

  7. Go1.18 新特性:高效复制,strings, bytes 库新增 Clone 功能

    大家好,期盼已久的 Go1.18 上周已经发布,今天给大家带来一个 1.18 版本新特性中的优化相关的内容,是与 strings 和 bytes 标准库有关. 背景 想要更快捷复制 在日常编程中,字节 ...

  8. Libusb-1.0.18 编译 、Usb-wifi编译、脚步编写

    Libusb-1.0.18 编译 ./configure –host=arm-linux-gnueabihf –prefix=/home/book/work/software/libusb-1.0.1 ...

  9. win10 go1.18.1安装beego和bee遇到的问题

    win10 go1.18.1安装beego和bee遇到的问题 问题:(1) 无法使用go get安装.(2)'bee'不是内部或外部命令,也不是可执行程序.(3)执行go env显示的GOPATH与系 ...

最新文章

  1. 关于Linux中权限列中的加号及点的深度探索
  2. 值得深思:美国感恩节78.3%的网购来自iOS
  3. 【PAT乙级】1069 微博转发抽奖 (20 分)
  4. 一个完备的要素SHAPE裁剪函数
  5. PKU 1061 青蛙的约会
  6. 梦幻内存辅助制作教程
  7. 数学建模-时间序列分析
  8. c语言知道坐标求圆面积,用C语言编程推算圆的面积公式
  9. 拥抱认知革命:区块链时代已至,临渊羡鱼不若自我革新
  10. The POODLE attack (SSLv3 supported) 漏洞修复
  11. 包装exp是什么意思_药瓶说明中EXP是什么意思?
  12. ApeCoin计划推出自己的区块链,Messari分析师们怎么看?
  13. ios运行html时黑屏,原神ios黑屏打不开怎么办?原神ios闪退解决方法
  14. django—APIView详细讲解
  15. (分享) 英语邮件要点
  16. STP理论01-背景及概念
  17. kali linux 开机要密码,kali更改开机加密密码
  18. 鸟巢目标检测图像数据集(1000多张高清原图;YOLO,VOC两类标签)
  19. Java实现两种方式 RSA签名, RSA签名校验
  20. 消防电气IP防护等级如何定义和解读

热门文章

  1. 记录Spring cloud alibaba Nacos学习
  2. 用netcat,SSH构建IP层Tunnel
  3. C++::namespace
  4. 纸上得来终觉浅,决知此事要躬行
  5. 基金什么时候买入好?
  6. ps切图(6)——参考线及辅助
  7. 基于RNN实现垃圾邮件辨别
  8. ios平台微信的语音文件AUD格式其实就是AMR格式
  9. oracle 审计设置,oracle审计简单设置
  10. n1 armbian php,斐讯N1盒子armbian 5.77蓝牙连接详细步骤斐讯N1刷入armbian 5.77写入emmc...