【问题标题】:Test memory consumption测试内存消耗
【发布时间】:2013-12-06 23:24:48
【问题描述】:

我需要验证特定函数在执行期间消耗了多少内存,并确保它保持在特定限制之下。

理想情况下,我希望在测试或基准测试中这样做。据我所知,唯一的方法是创建一个单独的测试二进制文件并使用来自

BenchmarkResult
func Benchmark(f func(b *B)) BenchmarkResult

这是正确的做法吗?

【问题讨论】:

    标签: go


    【解决方案1】:

    这并不是您使用testing 包的真正方式。只需创建一个名为 something_test.go 的文件并编写一个名为 func BenchmarkSomething(b *testing.B) 的函数即可。

    testing 包的文档包含更多细节,但基本上在您编写 _test.go 文件之后,您只需运行它们,启用基准测试,并针对您的问题,打开 -benchmem:

    go test -bench=. -benchmem
    

    这应该可以满足您的需求。

    【讨论】:

    • 好吧,基准测试需要一个设置阶段,我会在其中生成示例数据。所以我想这也会出现在基准测试中,从而使它毫无用处。
    • 您可以使用B type上的方法ResetTimer()StopTimer()StartTimer()
    • 我链接到的文档直接解决了这个问题,告诉你该怎么做,并展示了一个例子。
    • @ErikAigner,难道不能在您的测试文件的init() 函数中生成您的样本数据吗?
    • @kostix - 你可以这样做,但通常不建议这样做。使用上述各种 Timer() 函数是首选解决方案。一方面,当阅读代码时,它在视觉上明确了哪些是实际基准测试和哪些不是基准测试,而另一方面,它释放了源代码布局,以支持不同测试过程的多类测试数据。您仍然可以使用 init() 执行后者,但同样,它很丑陋,并且在阅读代码时发生的事情在词汇上并不明显。
    【解决方案2】:

    其实很简单:

    1. runtime.ReadMemStats(&m) 的memstats 读入m
    2. 调用f()
    3. 再次将 memstats 读入 m2
    4. 计算mm2 之间的差异

    例如:

    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)
    

    【讨论】:

    • 这比标准的方式简单。
    • 好吧,标准方式并没有显示我想要的信息。
    • 它显示了每次调用执行了多少分配操作以及每次调用期间分配了多少内存。这似乎是你所说的你想要的。也许你可以更好地表达你的问题。
    • 我发现这种方法对我有用。在创建文本编辑器时,我想确保我的实现不会左右分配字符串。我正在检查 1000 次操作后我没有 1000 倍的内存。对于这样的粗略计算,这是一个很好的方法。重要的部分是在测试内存的测试函数开始时调用runtime.GC()。否则其他测试功能的垃圾也在那里。
    • 谢谢,这实际上回答了问题,并解决了我的问题。 (我不明白为什么人们会认为另一个答案是正确的答案。)
    猜你喜欢
    • 2017-10-01
    • 2021-11-20
    • 2017-05-28
    • 2010-10-12
    • 1970-01-01
    • 2011-11-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多