- benchmark****个人理解
- 基准测试
- 单元测试
我个人理解中的benchmark(基准测试),是一种依据某些标准,通过运行一个程序或一组代码来测试其性能的行为。
下面我将用go testing库提供的benchmark来测试两段简单代码的性能,对比两者差异。
先创建项目
包select中包含两个go程序,add.go存放着两个被测函数add和mul,benchmark_test.go则放着基准测试样例(测试样例的程序名必须以_test结尾)。
两个函数非常简单,都是求n个x的和
第一个程序(add.go)
第二个程序(benchmark_test.go)
其中b.N是基准测试框架提供的,表示循环的次数。因为需要反复调用测试的代码,才可以评估性能运行时,基准测试框架将按照自动分配N的大小。
接着打开命令行窗口(快捷键win+r,在弹窗输入cmd)
进入包select,并输入“go test -bench=. .” ,然后就会跳出测试结果。
- go test 命令默认不执行 benchmark 测试,需要加上**-bench** 参数。
- 结果还会显示一些当前计算机的信息,操作系统和电脑位数等等。
- 第6行中显示基准测试名称,277192720表示测试的次数,也就是 testing.B 结构中提供给程序使用的N。“4.364 ns/op”表示每一个操作耗费多少时间(纳秒)。(即add函数进行了277192720次,每次求和花费了4.364 ns)。可以此类推第7行数据。
- 通过对比可知,mul函数的运行速度远快于add函数。
在学习基准测试时,我发现go testing库还提供单元测试的框架,就顺带学习了一下单元测试。
单元测试又称为模块测试,是针对程序模块来进行正确性检验的测试工作。
下面我用单元测试来检测大小比较函数的正确性。
单元测试和基准测试大同小异,前几个步骤都是创建项目然后编写被测函数和测试样例,不同的地方在于测试样例的写法和命令行的输入。
select.go存放比较函数,u_test.go存放测试样例
变化:
- BenchmarkXxx(b *testing.B) → TestXxx (t *testing.T)
- 没有了for循环和b.N
进入包,并输入“go test -v”,跳出测试结果。
第3行结果说明,函数正确。
版权归原作者 Yodng 所有, 如有侵权,请联系我们删除。