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 關注
- 221 瀏覽
添加回答
舉報