在go語言中Benchmark基準測試( 在后綴為_test.go的文件中,函數原型為 func BenchmarkXxx(b *testing.B) {}的函數 )可以用來幫助我們發現代碼的性能和瓶頸, 其最佳實踐 應該是我們最常用的 冒泡排序和快速排序的測試了,廢話不說,直接上代碼:
冒泡排序和快速排序算法代碼 sort_algorithm.go
package sortingimport "math/rand"// 冒泡排序算法
func BubbleSort(arr []int) {n := len(arr)for i := 0; i < n-1; i++ {for j := 0; j < n-i-1; j++ {if arr[j] > arr[j+1] {arr[j], arr[j+1] = arr[j+1], arr[j]}}}
}// 快速排序算法入口
func QuickSort(arr []int) {quickSort(arr, 0, len(arr)-1)
}// 快排算法
func quickSort(arr []int, low, high int) {if low < high {pivot := partition(arr, low, high)quickSort(arr, low, pivot-1)quickSort(arr, pivot+1, high)}
}// 快排拆分邏輯
func partition(arr []int, low, high int) int {pivot := arr[high]i := low - 1for j := low; j < high; j++ {if arr[j] < pivot {i++arr[i], arr[j] = arr[j], arr[i]}}arr[i+1], arr[high] = arr[high], arr[i+1]return i + 1
}// 生成指定長度的隨機數字切片
func makeRandomNumberSlice(n int) []int {numbers := make([]int, n)for i := range numbers {numbers[i] = rand.Intn(n)}return numbers
}const LENGTH = 10_000
冒泡排序和快速排序算法代碼基準測試用例 sort_algorithm_test.go
注意:b.N 基準函數必須運行目標代碼b.N次。在基準測試執行期間, b.N 會被動態調整來確保基準測試函數能夠持續足夠長的時間,從而確保時間的可靠性。
package sortingimport "testing"// 基準測試運行命令: go test -bench=. 這里的.表示運行當前所有的基準測試, 也可以指定函數名
// benchmark基準測試用例func BenchmarkBubbleSort(b *testing.B) {for i := 0; i < b.N; i++ {b.StopTimer() // 停止計時numbers := makeRandomNumberSlice(LENGTH)b.StartTimer() // 開始計時BubbleSort(numbers)}
}func BenchmarkQuickSort(b *testing.B) {for i := 0; i < b.N; i++ {b.StopTimer() // 停止計時numbers := makeRandomNumberSlice(LENGTH)b.StartTimer() // 開始計時QuickSort(numbers)}
}
運行結果
上面的結果中, 1-4行表示的是你當前測試用的機器的信息
在第5行的測試結果中第一列的 BenchmarkBubbleSort-16 這里的16表示有16個CPU來執行測試;
第二列的數字32表示循環了32次 這個數字越大越好
第三列的 35757363 ns/op 表示 每次操作的用時 35757363 納秒 這個數字越小越好
通過上面的基準測試結果,我們可以非常直觀的得出結論, 快速排序算法的表現最佳 ,他的時間復雜度為 O(n log n), 而冒泡排序表現較差,時間復雜度為 O(n^2)
參考
testing package - testing - Go Packages
https://dev.tekin.cn/