2016-02-04 73 views
1

什麼是將int []數組寫入byte []數組,但只有LSB(最後8位)最快的方法?我使用for循環和位掩碼bArray[i] = (byte)(iArray[i] & 0xFF),但數組很長(+ 900k),這需要大約50ms。你知道其他更快的選擇嗎?c#int [] array to byte [] array只有LSB

+0

你是說你想將int數組中的每個int的LSB放入字節數組中嗎? – bpgeck

+1

您需要處理將近一百萬個項目的速度超過50毫秒......您是否想過並行化爲GPU?除此之外,我認爲你可能遇到CPU限制 –

+0

@bpgeck yes,int數組中的每個int的LSB到字節數組。即將16位int數組的200個LSB值分配給200個8位字節數組。 – Archont

回答

1

您可以嘗試並行工作量:

Parallel.For(0,iArray.Length, i => bArray[i] = (byte)(iArray[i] & 0xFF)); 

這將產生多個線程來完成轉換。它傾向於在我的機器上更快,但由於產生多個線程的開銷,有時需要更長的時間。

你在做什麼,50ms太慢?緩慢的

+0

我想顯示圖像數組,但我的功能只需要字節作爲參數 - 256灰度就足夠了,比16位更快。 – Archont

1

部分來自於需要讀更多的數據比你需要:當你做

array[i] & 0xFF 

閱讀了整個4個字節的int的,砸三個最顯著的。

您可以通過不安全的代碼避免這種開銷。請注意,下面的方法假設小端架構:

static unsafe void CopyLsbUnsafe(int[] from, byte[] to) { 
    fixed (int* s = from) { 
     fixed (byte* d = to) { 
      byte* sb = (byte*) s; 
      int* db = (int*)d; 
      int* end = db + to.Length/4; 
      while (db != end) { 
       *db++ = (*(sb + 0) << 0) 
         | (*(sb + 4) << 8) 
         | (*(sb + 8) << 16) 
         | (*(sb + 12) << 24); 
       sb += 16; 
      } 
     } 
    } 
} 

上面的代碼重新解釋int陣列作爲一個字節數組,以及字節的數組作爲整數數組。然後它使用一個指針讀取每個第4個字節到目標數組中,使用一個整數指定以四個字節爲一組寫入目標。

我的測試顯示,在一個簡單的循環中,可觀的60%的改進。