2 回答
TA贡献1794条经验 获得超8个赞
由于您的示例程序没有执行任何实质性的计算,瓶颈将是数据写入内存的速度。使用示例中的设置,我们讨论的是 22 GB 的写入,这并不是无关紧要的。
鉴于两个示例的运行时间存在时间差异,一种可能的可能性是它实际上没有向 RAM 写入那么多。鉴于内存写入由 CPU 缓存,执行可能如下所示:
第一个 goroutine 将数据写入表示
data22
数组开头的缓存行。第二个 goroutine 将数据写入表示相同位置的缓存行。运行第一个 goroutine 的 CPU 注意到写入使自己缓存的写入无效,因此丢弃其更改。
第三个 goroutine 将数据写入表示相同位置的缓存行。运行第二个 goroutine 的 CPU 注意到写入使自己缓存的写入无效,因此丢弃其更改。
第三个 CPU 中的缓存行被逐出,并将更改写出到 RAM。
这个过程随着 goroutine 在data22
数组中的进展而继续。由于 RAM 是瓶颈,在这种情况下我们最终写入的数据量是后者的三分之一,因此它的运行速度大约是第二种情况的 3 倍也就不足为奇了。
TA贡献1866条经验 获得超5个赞
您正在使用大量内存。在第一个示例中 1000000000 * 8 = 8GB,在第二个示例中 3 * 1000000000 * 8 = 24GB。在第二个示例中,您可能使用了大量交换空间。磁盘 I/O 非常非常慢,即使在 SSD 上也是如此。
将 datalen := 1000000000 更改为 datalen := 100000000,减少 10 倍。你现在的运行时间是多少?每个示例至少平均运行 3 次。你的电脑有多少内存?你用的是SSD吗?
- 2 回答
- 0 关注
- 194 浏览
添加回答
举报