一、性能评估(综合评估,往往时间效率和空间效率不能同时获得)
(一)工具:
benchmark基准测试
1、得到执行时间的执行步骤
(1)确保目标分析函数所在的文件:假设为main.go。
(2)创建测试文件:在与main.go文件所在的目录下创建一个新的文件,命名为main_test.go。
(需要确保使用_test.go作为文件扩展名以符合Go语言的测试文件命名规范)
(3)编写测试函数:在main_test.go文件中,编写基准测试函数,并命名为BenchmarkXxx时也需要具有Test测试函数,并命名为TestXxx,其中Xxx为目标分析函数名:假设目标分析函为Fib,则基准测试函数命名为BenchmarkFib,Test测试函数命名为TestFib。
(4)BenchmarkFib函数要接收一个*testing.B类型的参数,TestFib函数要接收一个*testing.T类型的参数。
(5)导入testing包。
//以下是基本的测试文件框架
package main
import (
"testing"
)
//Test测试函数
func TestFib(t *testing.T) {
//测试逻辑
// ...
}
//基准测试函数
func BenchmarkFib(b *testing.B) {
//基准测试的代码逻辑
for i := 0; i < b.N; i++ {
//在此处调用要测试的函数
}
}
main.go文件中的函数:
func Fib(n int) int { // 基准测试的代码逻辑 if n < 2 { return n } return Fib(n-1) + Fib(n-2)}
main_test.go文件:
package mainimport ( "testing")func TestFib(t *testing.T) { // 测试逻辑 // ...}func BenchmarkFib(b *testing.B) { // 基准测试逻辑 for i := 0; i < b.N; i++ { // 进行重复的测试操作 Fib(10) }}
(6)命令行调用基准测试函数:go test -bench=.
针对基准测试,go test默认情况下只会打印基准测试的执行时间,并不会显示内存分配等其他信息。
(7)更多信息
如果希望获得更详细的基准测试结果,包括内存分配信息,可以使用go test -bench=. -benchmem -memprofile 命令。
这个命令会执行基准测试,并生成一个内存分配的性能分析文件,生成的文件名为。
//示例命令:go test -bench=. -benchmem -memprofile memprofile.out
生成入下2个文件:memprofile.out和main.test.exe
(8)使用go tool pprof工具来分析生成的性能分析文件:go tool pprof -alloc_objects your-binary memprofile.out,其中需要将your-binary替换为main.test.exe文件的路径。
//示例命令:
go tool pprof -alloc_objects your-binary memprofile.out
这个命令将打开交互式命令行界面,可以输入top命令来查看内存分配排名,以及其他提示输入命令来进一步分析内存使用情况和性能瓶颈等信息。
二、性能优化建议
(一)Slice
1、Slice预分配内存尽可能在使用make()初始化切片时提供容量信息
//未预分配内存,执行时间较长
func NoPreAlloc(size int) {
data := make([]int,0)
for k := 0; k< size; k++ {
data = append(data, k)
}
}
//预分配内存,执行时间短
func PreAlloc(size int) {
data := make([]int, 0, size)
for k := 0; k < size; k++ {
data = append(data, k)
}
}