跳转到主要内容

【Go语言测试】使用基准分析 Go 函数的性能

这篇博文是对 justforfunc 第 28 集的补充,您可以在下方观看。

https://youtu.be/2AulMm-hsdI

在上一篇博文中,我讨论了在 Go 中合并 n 个通道的两种不同方式,但我们没有讨论哪种方式更快。与此同时,YouTube 评论中提出了第三种合并频道的方法。

这篇博文将展示第三种方式,并从性能角度比较所有方式,并使用基准进行分析。

第三种渠道合并方式


两集前,我们讨论了如何使用单个 goroutine 和 nil 通道合并两个通道。我们将这里的该函数称为 mergeTwo。一个 justforfunc 查看器提出了一种使用此函数和递归的方法,以提供一种合并 n 个通道的方法。


使用递归合并 N 个通道
解决方案非常聪明。如果我们有:

  • 一个频道,我们返回那个频道。
  • 两个或更多通道,我们合并一半通道,然后使用使用高效函数的结果合并它们。

没有频道怎么办?我们将返回一个已经关闭的通道。

【Go语言测试】如何在 Go 中编写基准测试

这篇文章继续了我几周前开始的测试包系列。您可以在此处阅读上一篇关于编写表驱动测试的文章。您可以在 https://github.com/davecheney/fib 存储库中找到下面提到的代码。

介绍


Go 测试包包含一个基准测试工具,可用于检查 Go 代码的性能。这篇文章解释了如何使用测试包来编写一个简单的基准测试。

您还应该查看 Profiling Go 程序的介绍性段落,特别是有关在您的机器上配置电源管理的部分。无论好坏,现代 CPU 严重依赖主动热管理,这会给基准测试结果增加噪音。

编写基准


我们将重用上一篇文章中的 Fib 函数。

func Fib(n int) int {
        if n < 2 {
                return n
        }
        return Fib(n-1) + Fib(n-2)
}


基准放置在 _test.go 文件中,并遵循其测试对应物的规则。在第一个示例中,我们将对计算斐波那契数列中第 10 个数字的速度进行基准测试。

【Go语言高级开发】Go 程序基准测试简介

在本文中,我们将看看基准测试。更具体地说,我们将研究如何对基于 Go 的程序进行基准测试。

在性能很重要的时候,能够对程序的执行方式进行基准测试并分析潜在的瓶颈在哪里,真的很有价值。通过了解这些瓶颈所在的位置,我们可以更有效地确定将工作重点放在哪里,以提高我们系统的性能。

注意 - 需要注意的是,性能调整通常应在系统启动并运行后进行。

“过早的优化是万恶之源”——Donald Knuth

在本教程中,我们将研究如何为非常简单的函数执行标准基准测试,然后转向更高级的示例,最后研究如何生成看起来很酷的火焰图。

先决条件

 

  • 您需要在开发机器上安装 Go 版本 1.11+。

一个简单的基准测试


在 Go 中,基准测试可以与标准单元测试一起编写。这些基准函数应以“Benchmark”为前缀,后跟函数名称,与您为测试函数添加前缀 Test 的方式相同。

让我们从我们之前的测试文章中获取我们的代码,并尝试为此编写一个简单的基准函数。创建一个名为 main.go 的新文件并将以下代码添加到该文件中: