簡體   English   中英

我應該使用查找列表而不是大量的乘法嗎?

[英]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 ),然后存儲這些結果。

這些可能會加快您的速度;

  • 使SizeX,SizeY,SizeZ常量
  • 預計算SizeXZ = SizeX * SizeZ及其他(也作為常量);

預先計算的數組索引將不會給您帶來太大的好處,因為預先計算的列表將非常大,並且由於做很少的簡單數學運算而對其進行查詢可能不會更快。

由於大多數訪問都經過邊界檢查,因此C#中的數組操作相對較慢(與某些其他語言相比)。 有一些方法可以解決這個問題。

  • 在不安全的部分中放置緊密的arrayloop並使用指針,請參見C#或Google中的大型數組算術,以了解“矩陣乘法不安全C#”
  • Mono具有跳過邊界檢查的參數。 您的情況可能會更快

可能還需要另一種加速方式來安排您的數學循環,以便您的數學處理順序訪問大型數組。 這樣,每次訪問都受益於這樣的事實,即數據通常已經由先前的計算提取到了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM