【发布时间】:2013-12-06 23:24:48
【问题描述】:
我需要验证特定函数在执行期间消耗了多少内存,并确保它保持在特定限制之下。
理想情况下,我希望在测试或基准测试中这样做。据我所知,唯一的方法是创建一个单独的测试二进制文件并使用来自
的BenchmarkResult
func Benchmark(f func(b *B)) BenchmarkResult
这是正确的做法吗?
【问题讨论】:
标签: go
我需要验证特定函数在执行期间消耗了多少内存,并确保它保持在特定限制之下。
理想情况下,我希望在测试或基准测试中这样做。据我所知,唯一的方法是创建一个单独的测试二进制文件并使用来自
的BenchmarkResult
func Benchmark(f func(b *B)) BenchmarkResult
这是正确的做法吗?
【问题讨论】:
标签: go
这并不是您使用testing 包的真正方式。只需创建一个名为 something_test.go 的文件并编写一个名为 func BenchmarkSomething(b *testing.B) 的函数即可。
testing 包的文档包含更多细节,但基本上在您编写 _test.go 文件之后,您只需运行它们,启用基准测试,并针对您的问题,打开 -benchmem:
go test -bench=. -benchmem
这应该可以满足您的需求。
【讨论】:
ResetTimer()、StopTimer()、StartTimer()
init() 函数中生成您的样本数据吗?
其实很简单:
runtime.ReadMemStats(&m) 的memstats 读入m
f()
m2
m 和m2 之间的差异
例如:
var m1, m2 runtime.MemStats
runtime.GC()
runtime.ReadMemStats(&m1)
f()
runtime.ReadMemStats(&m2)
fmt.Println("total:", m2.TotalAlloc - m1.TotalAlloc)
fmt.Println("mallocs:", m2.Mallocs - m1.Mallocs)
【讨论】:
runtime.GC()。否则其他测试功能的垃圾也在那里。