我试图用我的"程序"分配内存-只是分配它并保留在那里-用于测试目的。 当我在MacOS上运行它时,活动监视器显示它分配了1.6 gb,而当我为Linux编译它并在那里运行它时,它什么也没做-它显示消息,但计算机上没有使用ram。 我做错了吗? 有没有更好的办法? 这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package main


import (
   "fmt"
   "unsafe"
   "time"
)


func main() {
    var buffer [100 * 1024 * 1024]string
    fmt.Printf("The size of the buffer is: %d bytes\
", unsafe.Sizeof(buffer))
    time.Sleep(300 * time.Second)
}

首先,我使用字节作为数组类型,但在Mac上它没有起作用?

  • 测量"使用了多少内存"是25年前的一项简单任务。 它不再简单,因为存在大量不同类型的"内存"。"已使用"是记忆的一个模糊术语。 使用go test -benchmem提供的工具来查看代码的"分配负担"。 该指标更可靠,更重要。

您的代码中没有任何内容需要内存。编译器完全有能力优化整个分配,并且即使编译器不执行该操作,操作系统也不会提交内存-您永远不会分配任何内容,因此可能只是镜像零页。

对于所使用的Linux和所使用的MacOS之间的细微差别,我一无所知,因此可以肯定地说的话。很有可能是,当您在MacOS上看到所有虚拟内存时,在Linux机器上检查内存的方式只给了您已提交的内存,或者可能还有其他细微的差别。在任何情况下,由于编译器变得智能,并且我们在PC上拥有虚拟内存,因此获取任何有意义的基准变得越来越难了–我们使用的工具通常足够聪明,可以避免不必要的浪费;而您要尝试的大多数基准测试几乎完全是不必要的浪费。

基准测试很难。

  • 谢谢,我只是在玩耍,想看看会发生什么。 这:"您的代码中没有任何内容需要内存。编译器完全有能力优化整个分配,即使编译器没有执行它也是如此" :)-我添加了for e, _ := range buffer { \t\tbuffer[e] ="string" \t},现在我运行时 它在Linux上使用的内存框达到1.6演出。