我是新手,但是我需要测量运行需要多少内存,我编写了以下代码:
package main
import (
"fmt"
"log"
"runtime"
"time"
)
func ack(m, n uint) uint {
if m == 0 {
return n + 1
} else if n == 0 {
return ack(m - 1, 1)
} else {
return ack(m - 1, ack(m, n - 1))
}
}
func memory(){
for {
var m runtime.MemStats
runtime.ReadMemStats(&m)
log.Printf("\nAlloc = %v\nTotalAlloc = %v\nSys = %v\nNumGC = %v\n\n", m.Alloc / 1024, m.TotalAlloc / 1024, m.Sys / 1024, m.NumGC)
time.Sleep(5 * time.Second)
}
}
func main() {
var inicio = time.Now().UnixNano()
fmt.Println(ack(1,2))
var fim = time.Now().UnixNano()
fmt.Println(fim - inicio)
memory()
}
但我不知道这是否对,是否有合适的措施我应该考虑。 预先谢谢你。
答案 0 :(得分:6)
我做了一个数学函数,需要查看要运行的内存消耗。
要做的第一件事是使用Go testing package来运行Go基准测试。 Go基准测试用于衡量Go标准库,Go工具链中以及一般Go代码的性能。
例如,
mathfunc_test.go
:
package main
import (
"testing"
)
func ack(m, n uint) uint {
if m == 0 {
return n + 1
} else if n == 0 {
return ack(m-1, 1)
} else {
return ack(m-1, ack(m, n-1))
}
}
func BenchmarkAck(b *testing.B) {
b.ReportAllocs()
for n := 0; n < b.N; n++ {
ack(2, 42)
}
}
输出:
$ go test mathfunc_test.go -bench=.
goos: linux
goarch: amd64
BenchmarkAck-8 200000 9159 ns/op 0 B/op 0 allocs/op
PASS
$
memStats.TotalAlloc
用于测量堆B/op
。 memStats.Mallocs
用于测量堆allocs/op
。
堆栈内存很便宜,因此无法测量。由Go垃圾收集器(GC)管理的堆内存比较昂贵,因此可以进行测量。