当前位置:首页 > 科技  > 软件

Go1.0 到 1.22 的性能表现,提高了多少倍?

来源: 责编: 时间:2024-05-16 09:10:43 93观看
导读大家好,我是煎鱼。五一假期时看到 @Ben Hoyt 大佬分享的文章《Go performance from version 1.0 to 1.22》,分享了他在这么多年来一直坚持不懈的对 Go 进行性能测试的记载。今天基于此分享给大家,有所调整和精简。原作者

大家好,我是煎鱼。04Z28资讯网——每日最新资讯28at.com

五一假期时看到 @Ben Hoyt 大佬分享的文章《Go performance from version 1.0 to 1.22》,分享了他在这么多年来一直坚持不懈的对 Go 进行性能测试的记载。04Z28资讯网——每日最新资讯28at.com

今天基于此分享给大家,有所调整和精简。04Z28资讯网——每日最新资讯28at.com


原作者对 Go1.0 到 Go1.22 的所有 Go 版本进行了性能测试,包含了在 Go 1.20 中新增的性能分析引导优化(PGO)的结果。04Z28资讯网——每日最新资讯28at.com

Go 测试项目用的是 GoAWK[1] 项目,该项目用 Go 写的 AWK 解释器,支持 CSV。04Z28资讯网——每日最新资讯28at.com

GoAWK 使用案例如下:04Z28资讯网——每日最新资讯28at.com

$ go install github.com/benhoyt/goawk@latest$ goawk 'BEGIN { print "foo", 42 }'foo 42$ echo 1 2 3 | goawk '{ print $1 + $3 }'4# Or use GoAWK's CSV and @"named-field" support:$ echo -e 'name,amount/nBob,17.50/nJill,20/n"Boba Fett",100.00' | /  goawk -i csv -H '{ total += @"amount" } END { print total }'137.5

性能测试

接下来正式开始进行性能测试,主要是同项目多版本测试的模式。04Z28资讯网——每日最新资讯28at.com

原作者(下称:我)通过在两个 AWK 程序上运行 GoAWK 来测试这一点,这两个程序代表了使用 AWK 可以做的极端不同情况:I/O 操作与字符串处理,以及数值计算。04Z28资讯网——每日最新资讯28at.com

countwords(字符串处理任务)

首先是 countwords,这是一个字符串处理任务,它计算输入中单词的频率并打印出带有计数的单词。这是 AWK 脚本的典型应用。04Z28资讯网——每日最新资讯28at.com

程序输入是某本书的 10 倍串联版本的内容。04Z28资讯网——每日最新资讯28at.com

以下是部分代码:04Z28资讯网——每日最新资讯28at.com

{    for (i=1; i<=NF; i++)        counts[tolower($i)]++}END {    for (k in counts)        print k, counts[k]}

sumloop(循环统计任务)

第二个程序是 sumloop,这是一个紧凑的循环,它多次将循环计数器加到一个变量上。04Z28资讯网——每日最新资讯28at.com

这个程序并不是 AWK 的典型用法,但它是测试 GoAWK 字节码解释器循环的好方法。04Z28资讯网——每日最新资讯28at.com

以下是部分代码:04Z28资讯网——每日最新资讯28at.com

BEGIN {    for (i=0; i<10000000; i++)        sum += i+i+i+i+i}

注:我不得不对 GoAWK 的代码做了一些微调,以便它能在旧版本的 Go 上编译。特别是对于 Go 1.0,因为它没有 bufio.Scanner,而 GoAWK 在很大程度上依赖它。我为 1.0 使用了 Go 1.1 的 bufio.Scanner 实现。04Z28资讯网——每日最新资讯28at.com

性能测试图表

图表中的计时数字是我在 x86-64 Linux 笔记本电脑上运行三次中的最佳时间(以秒为单位)。蓝线代表 countwords 程序,红线代表 sumloop 程序。04Z28资讯网——每日最新资讯28at.com

Go 各版本的性能测试结果的图表如下:04Z28资讯网——每日最新资讯28at.com

图片04Z28资讯网——每日最新资讯28at.com

请注意,这次 Y 轴是对数的,目的是为了更清晰地看到最近版本中更微妙的改进。04Z28资讯网——每日最新资讯28at.com

图表中还包括了每个 Go 版本下的 GoAWK 二进制文件大小 —— 那是浅灰色线。04Z28资讯网——每日最新资讯28at.com

一些要点

1、Go 最大的改进出现在 1.3、1.5、1.7 和 1.12 版本中。在此之后的版本,性能提升变得非常渐进 —— 这意味着所有容易实现的优化早已完成。04Z28资讯网——每日最新资讯28at.com

2、Go 1.2 性能变差了,countwords 出现了一个奇怪的峰值:它从 1.1 的 7.5 秒增加到 1.2 的 25.5 秒(!),然后下降到 1.3 的 2.8 秒。04Z28资讯网——每日最新资讯28at.com

我通过分析并注意到 Go 运行时栈操作占据了运行时间的很大一部分,找出了 1.2 异常的原因。04Z28资讯网——每日最新资讯28at.com

以下是 pprof 输出的前几行:04Z28资讯网——每日最新资讯28at.com

$ go tool pprof --text ./goawk_1.2 go12.profTotal: 1830 samples     332  18.1%  18.1%      332  18.1% runtime.newstack     296  16.2%  34.3%      296  16.2% runtime.memclr     281  15.4%  49.7%      281  15.4% runtime.oldstack     222  12.1%  61.8%      619  33.8% github.com/benhoyt/goawk/interp.(*interp).execute      91   5.0%  66.8%       91   5.0% runtime.lessstack      75   4.1%  70.9%      133   7.3% github.com/benhoyt/goawk/interp.(*interp).callBuiltin      57   3.1%  74.0%       57   3.1% runtime.stackfree      53   2.9%  76.9%       81   4.4% strings.FieldsFunc      ...

这几乎可以肯定是由于在 1.3 中修复的堆栈 “热分裂” 问题[2]所导致的性能下降,因为在该版本 Go 团队将 goroutine 栈的实现从旧的分段模型改为连续模型。04Z28资讯网——每日最新资讯28at.com

3、PGO 仅将性能提高了几个百分点,使用 Go 1.22,countwords 大约提高了 2%,sumloop 提高了 7%。我使用 PGO 编译了发布的 GoAWK 二进制文件。04Z28资讯网——每日最新资讯28at.com

4、二进制文件的大小多年来一直保持相对稳定,除了 1.2 版本中的大幅增加。即使启用了 PGO,二进制文件的大小也只有大约 5% 的增加,所以我认为通常这是值得的。04Z28资讯网——每日最新资讯28at.com

结论

从测试结果来看,countwords 现在的运行速度比使用 Go 1.0 时快了大约 8 倍,而 sumloop 快了 24 倍。04Z28资讯网——每日最新资讯28at.com

Go 所编写的程序变快的原因有许多,包含但不限于 Go 团队和外部贡献者改进了编译器,并优化了运行时、垃圾回收器和标准库等。04Z28资讯网——每日最新资讯28at.com

煎鱼注:不得不说,感谢 Go 核心团队多年来的辛勤工作!让我们躺着升级个版本,就能实现性能的提高。04Z28资讯网——每日最新资讯28at.com

参考资料

[1]GoAWK: https://github.com/benhoyt/goawk04Z28资讯网——每日最新资讯28at.com

[2]堆栈 “热分裂” 问题: https://docs.google.com/document/u/0/d/1wAaf1rYoM4S4gtnPh0zOlGzWtrZFQ5suE8qr2sD8uWQ/mobilebasic?_immersive_translate_auto_translate=104Z28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-88398-0.htmlGo1.0 到 1.22 的性能表现,提高了多少倍?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: React 全新编译器太好用了!

下一篇: 有哪些 Java 面试题 90% 的公司会问到?

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 对标苹果的灵动岛 华为带来实况窗功能

    对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • CSS单标签实现转转logo

    CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 小米MIX Fold 3配置细节曝光:搭载领先版骁龙8 Gen2+罕见5倍长焦

    小米MIX Fold 3配置细节曝光:搭载领先版骁龙8 Gen2+罕见5倍长焦

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top