如何确定函数的内存消耗?

时间:2018-10-12 10:27:39

标签: performance go memory

我是新手,但是我需要测量运行需要多少内存,我编写了以下代码:

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()                                                           
}

但我不知道这是否对,是否有合适的措施我应该考虑。 预先谢谢你。

1 个答案:

答案 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/opmemStats.Mallocs用于测量堆allocs/op

堆栈内存很便宜,因此无法测量。由Go垃圾收集器(GC)管理的堆内存比较昂贵,因此可以进行测量。

相关问题