2012-09-27 50 views
4

可能重複:
C#: Any faster way of copying arrays?C#:如何有效地複製一大堆結構體?

我有結構的一個這樣的數組:

struct S 
{ 
    public long A; 
    public long B; 
} 

... 
S[] s1 = new S[1000000]; 
... 
S[] = new S[s1.Length]; 
// Need to create a copy here. 

我可以使用不安全的模式和結構的源陣列複製到字節數組,然後從字節數組到結構的目標數組。但這意味着我將不得不分配一個巨大的中間字節數組。有沒有辦法避免這種情況?是否有可能以某種方式將目標數組表示爲字節數組並直接複製到那裏?

unsafe 
{ 
    int size = Marshal.SizeOf(s0[0]) * s0.Length; 
    byte[] tmp = new byte[size]; 
    fixed (var tmpSrc = &s0[0]) 
    { 
     IntPtr src = (IntPtr)tmpSrc; 
     Marchal.Copy(tmpSrc, 0, tmp, 0, size); 
    } 

    // The same way copy to destination s1 array... 
} 
+9

你有沒有試過只是做一個正常的數組副本,並做了性能測試呢?在優化之前驗證正常路線不太慢。 – Servy

+0

@PeterRitchie刪除我的評論。實際上使用Buffer.BlockCopy可能是要去的。但問題仍然有效。也許不是從實際的角度:) – Schultz9999

+0

看起來像合理的路標複製...考慮不刪除。 –

回答

0

Buffer.BlockCopy情況下,拷貝字節[]爲byte [],而不是在陣列的邏輯元素。

但是,這確實取決於個案。

請先用Array.Copy先測試一下你的密碼,然後看看。

+1

什麼是'BlackCopy'? – Gabe

+0

@Gabe編輯:黑色 - >阻止 – Schultz9999

-1

複製的替代方法:最快的方法是不要複製任何東西。

如果您可以保證您感興趣的數組部分不會改變,您可以給出一些替代接口(即IEnumerable<S>)來讀取這些部分。

如果您正在複製創建另一個大型數組 - 考慮簡單地爲第二部分創建新數組,並通過某個接口將2個或更多數組作爲單個實體公開。

+0

複製的原因很簡單:啓用無鎖定讀取。可以有一個這樣的數組池,每個數組都可以被獨立的線程讀取。同時,系統可以更新個人或部分項目。有一個主副本累積更新並定期將其內容轉儲到沒有讀取器的池中的一個數組(讀者根據一個活動數組進行分配 - 參考計數;一旦讀取器完成了一個數組,它就變爲空閒,所以可以更新並使其對新請求生效)。所以這個主要工作數組更新是我在這裏說的。 – Schultz9999

+0

我不知道物品的底層結構。我曾考慮過對數據進行分區,但不幸的是,我沒有足夠的信息,可能永遠都不能成功創建好的映射。 – Schultz9999