1 回答

TA貢獻1847條經驗 獲得超11個贊
是的,就像在您的機器上運行的所有其他代碼一樣,它們都使用 CPU 緩存。
告訴您如何編寫應用程序以使其最有效地使用緩存,這個問題太寬泛了。我強烈建議設置 Go Benchmarks,然后重構您的代碼并比較時間。(請注意,不要在 VM 內進行基準測試 - VM 和任何平臺上的種類都沒有足夠準確的時鐘來進行 Go 的基準測試。而是運行操作系統原生的所有基準測試,而不是 VM)。
這一切都取決于您編寫應用程序以有效利用CPU 緩存的能力。這是一個更廣泛的主題,涉及如何使用變量、它們多久更新一次、什么留在堆上或在堆棧上進行 GC 以及多久更新一次,等等。
一個小例子,為您指明正確的方向,閱讀有關高效 L1 和 L2 緩存開發的更多信息……
L1 緩存使用 64 位行。如果要存儲 4 個 16 位 Int16,通常它們將分配在堆棧上,并且很可能都存儲在緩存的同一行中。
假設您要更新 Int16 之一?好吧,CPU 緩存無法更新該行的一部分:它必須使整行無效,并使用前 3 個 Int16 和您的新更新值分配一個全新的緩存行。
非常低效。
該問題的一種解決方案是使用 Int64s,它的 CPU 緩存只會使 1 行無效,但會將其他 3 行保留在緩存中以便快速讀取。你是在做更多的推送還是彈出?等等。
同樣,這在很大程度上取決于您的用例:如果您使用這 4 個整數的大量上下文切換(例如互斥鎖),這甚至可能會減慢速度。在這種情況下,這是一個完全不同的優化問題。
我建議閱讀堆棧和堆上的高頻縮放和內存分配。
- 1 回答
- 0 關注
- 121 瀏覽
添加回答
舉報