ToB企服应用市场:ToB评测及商务社交产业平台

标题: Go语言基准测试(benchmark)三部曲之二:内存篇 [打印本页]

作者: 天空闲话    时间: 2023-11-30 03:51
标题: Go语言基准测试(benchmark)三部曲之二:内存篇
欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览

基本操作

  1. go test -bench='Fib$' -benchmem .
复制代码
新增两个方法用于基准测试

  1. // 往切片中放入指定数量的随机数,这个切片没有提前设置容量
  2. func newSlice(n int) []int {
  3.         rand.Seed(time.Now().UnixNano())
  4.         // 注意,这里在生成切片的时候并没有指定容量
  5.         nums := make([]int, 0)
  6.         for i := 0; i < n; i++ {
  7.                 nums = append(nums, rand.Int())
  8.         }
  9.         return nums
  10. }
  11. // 往切片中放入指定数量的随机数,这个切片提前设置了容量
  12. func newSliceWithCap(n int) []int {
  13.         rand.Seed(time.Now().UnixNano())
  14.         // 注意,这里在生成切片的时候指定了容量
  15.         nums := make([]int, 0, n)
  16.         for i := 0; i < n; i++ {
  17.                 nums = append(nums, rand.Int())
  18.         }
  19.         return nums
  20. }
复制代码
  1. const (
  2.         SLICE_LENGTH_MILLION         = 1000000   // 往切片中添加数据的长度,百万
  3.         SLICE_LENGTH_TEN_MILLION     = 10000000  // 往切片中添加数据的长度,千万
  4.         SLICE_LENGTH_HUNDRED_MILLION = 100000000 // 往切片中添加数据的长度,亿
  5. )
复制代码
  1. func BenchmarkNewSlice(b *testing.B) {
  2.         for n := 0; n < b.N; n++ {
  3.                 newSlice(SLICE_LENGTH_MILLION)
  4.         }
  5. }
  6. func BenchmarkNewSliceWithCap(b *testing.B) {
  7.         for n := 0; n < b.N; n++ {
  8.                 newSliceWithCap(SLICE_LENGTH_MILLION)
  9.         }
  10. }
复制代码
  1. go test -bench='BenchmarkNewSlice$|BenchmarkNewSliceWithCap$' -benchmem .
复制代码
  1. go test -bench='BenchmarkNewSlice$|BenchmarkNewSliceWithCap$' -benchmem .
  2. goos: darwin
  3. goarch: arm64
  4. pkg: benchmark-demo
  5. BenchmarkNewSlice-8          68  16568869 ns/op 41678153 B/op  38 allocs/op
  6. BenchmarkNewSliceWithCap-8   84  14098503 ns/op  8003589 B/op   1 allocs/op
  7. PASS
  8. ok      benchmark-demo  2.769s
复制代码
同一方法的不同数量级对比

  1. func testNewSlice(len int, b *testing.B) {
  2.         for n := 0; n < b.N; n++ {
  3.                 newSlice(len)
  4.         }
  5. }
复制代码
  1. func BenchmarkNewSlicMillion(b *testing.B) {
  2.         testNewSlice(SLICE_LENGTH_MILLION, b)
  3. }
  4. func BenchmarkNewSlicTenMillion(b *testing.B) {
  5.         testNewSlice(SLICE_LENGTH_TEN_MILLION, b)
  6. }
  7. func BenchmarkNewSlicHundredMillion(b *testing.B) {
  8.         testNewSlice(SLICE_LENGTH_HUNDRED_MILLION, b)
  9. }
复制代码
  1. go test -bench='Million$' -benchmem .
复制代码
  1. go test -bench='Million$' -benchmem .
  2. goos: darwin
  3. goarch: arm64
  4. pkg: benchmark-demo
  5. BenchmarkNewSlicMillion-8         67    16283754 ns/op  41678145 B/op    38 allocs/op
  6. BenchmarkNewSlicTenMillion-8       7   159938941 ns/op  492000525 B/op   49 allocs/op
  7. BenchmarkNewSlicHundredMillion-8   1  2242365417 ns/op  4589008224 B/op  60 allocs/op
复制代码
欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4