Julia 的 inbounds
有在做套件開發的開發者們應該不陌生 @inbounds
這個 macro,在很多現代程式語言中也有。
在存取陣列時,為了安全性與正確性的考量,避免存取到陣列範圍以外的記憶體位置,很多語言都設置了邊界檢查(bounds check)。
邊界檢查會檢查所存取的索引值是否在陣列的範圍內,但是這樣的檢查會有些微的效能損耗,尤其在迴圈內的情況更有可能被累積而放大,關於 Julia 的 邊界檢查可以參考官方文件 Bounds checking。
如果可以確定所存取的索引值一定在範圍內,我們就可以把邊界檢查給移除,以加速陣列的存取。如以下範例:
1 | A = rand(3, 4) |
或是
1 | A = rand(3, 4) |
@inbounds
會將程式碼區塊中的邊界檢查給移除,可以參考 @inbounds
的官方文件。使用時必須注意存取的索引值,否則小則存取的值錯誤,大則可能導致程式崩潰。
先養成好的索引習慣,再考慮將效能提升,加入 @inbounds
。相關的資訊也紀錄在官方的效能建議中。