为了账号安全,请及时绑定邮箱和手机立即绑定

Go中切片排序的意外基准结果

Go中切片排序的意外基准结果

Go
不负相思意 2021-08-01 12:53:16
我刚开始学习 golang 并决定实现一些基本的排序算法(冒泡排序、选择排序和插入排序)来尝试使用包、切片和测试基础设施。这是实现:package child_sortfunc SortBubble(xs []int) {    for i := range xs {        swapped := false        for j := 1; j < len(xs)-i; j++ {            if xs[j-1] > xs[j] {                xs[j-1], xs[j] = xs[j], xs[j-1]                swapped = true            }        }        if !swapped {            break        }    }}func SortSelection(xs []int) {    for i := range xs {        min_i := i        for j := i + 1; j < len(xs); j++ {            if xs[j] < xs[min_i] {                min_i = j            }        }        if min_i != i {            xs[i], xs[min_i] = xs[min_i], xs[i]        }    }}func SortInsertion(xs []int) {    for i := 1; i < len(xs); i++ {        for j := i; j > 0; j-- {            if xs[j] < xs[j-1] {                xs[j], xs[j-1] = xs[j-1], xs[j]            }        }    }}单元测试似乎工作正常,但是当我为这些创建基准测试时,我得到了奇怪的结果,如下所示:go test --bench . --benchmem PASSBenchmarkBubble        1    2258469081 ns/op      241664 B/op          1 allocs/opBenchmarkSelection  1000000000           0.60 ns/op        0 B/op          0 allocs/opBenchmarkInsertion         1    1180026827 ns/op      241664 B/op          1 allocs/opok      .../go/src/child_sort   12.976s困扰我的是选择排序几乎立即运行并产生零分配。如果我减小数组的大小,其他排序算法也会发生同样的事情。反之亦然,即如果我增加大小,选择排序开始正常运行。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信