[英]Should i use lookup-lists instead of a lot of multiplication?
在我的應用程序中,我有一個非常大的字節數組,它是一個展平的3維數組,我們使用3個嵌套的for循環(x,y,z)填充該數組,然后通過使用一些數學運算來獲得所需的值,最具體地說:
要在數組中獲取索引:
return x + z*SizeX + y*SizeX*SizeZ;
並返回x / y / z坐標(給定一個索引):
int index = pos;
var y = (ushort) (pos/SizeX/SizeZ);
pos -= y*SizeX*SizeZ;
var z = (ushort) (pos/SizeX);
pos -= z*SizeX;
var x = (ushort) pos;
return new BlockPos(x, y, z, index, this);
首先,我想第二個可以提高效率,我只是不知道該怎么做,任何幫助將不勝感激:P
我的主要問題是,為我創建y和x值的查找表(在加載類時填充)會更快嗎?還是只在其中保留乘法會更快?
編輯在某些情況下,該數學運算稱為LOT,因此,即使它運行得更快,即使啟動時間更長,其差異也會更好。
在大多數語言和體系結構中,乘法將成為一個(或幾個)機器指令。 盡管這些指令可能相對昂貴,但與執行查找操作相比,它們應該仍然更便宜-無論如何,查找操作很可能需要乘法。
例如,“定位數組的第四個元素”將是
<array base address> + (3 * <array element size>)
我建議您使用偽代碼進行的唯一優化是一次執行“恆定”操作(例如SizeX*SizeZ
),然后存儲這些結果。
這些可能會加快您的速度;
預先計算的數組索引將不會給您帶來太大的好處,因為預先計算的列表將非常大,並且由於做很少的簡單數學運算而對其進行查詢可能不會更快。
由於大多數訪問都經過邊界檢查,因此C#中的數組操作相對較慢(與某些其他語言相比)。 有一些方法可以解決這個問題。
可能還需要另一種加速方式來安排您的數學循環,以便您的數學處理順序訪問大型數組。 這樣,每次訪問都受益於這樣的事實,即數據通常已經由先前的計算提取到了CPU緩存中。 因此,以這樣的方式構造x,y,z循環,使您獲得index = 1,index = 2,index = 3等。而NOT index = 0,index = 256,index = 512等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.