2011-10-16 36 views

回答

2

如果您使用指針直接訪問,則使用32位或64位整數並對其進行移位。應該給出相同的結果,但我預計它會快得多(因素2左右)。另一個加速應該來自避免訪問二維數組的複雜索引邏輯。

像這樣:

fixed(UInt16* p0=&arr) 
{ 
    UInt32* p=(UInt32*)p0; 
    UInt32* p_end=p+1000*1000/(sizeof(UInt32)/sizeof(UInt16)); 
    while(p!=p_end) 
    { 
     *p = *p << 6; 
    } 
} 

我假定在一個32位處理32位整數會更快,而在64位進程64個整數會更快。

您可能想要做一些手動循環展開,即將多個賦值放入循環的一次迭代中。

您還可能需要特別注意數組的末尾。如果數組的大小不是您選擇的整數大小的倍數。

+0

謝謝。我希望有一些本地代碼庫的功能,將提供超過2倍。 – ChrisJJ

+0

@ChrisJJ它得到了多快?因素2只是一個保守的估計。 – CodesInChaos

0

無論您使用哪種解決方案,都可以通過使用多個線程來加速。只是不要鎖定相同的對象,以某種方式保持數據分離。

+0

僅對於某些CPU,請注意。 – ChrisJJ

相關問題