2012-09-27 3 views
4

가능한 중복 : 나는 안전하지 않은 모드를 사용하고에 구조체의 소스 배열을 복사 할 수 있습니다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. 

:
C#: Any faster way of copying arrays?

는이 같은 구조체의 배열을 가지고 바이트 배열에서 구조체의 대상 배열로 이동합니다. 그러나 그것은 거대한 중간 바이트 배열을 할당해야한다는 것을 의미합니다. 이것을 피할 수있는 방법이 있습니까? 어떻게 든 목적지 배열을 바이트 배열로 표현하고 거기에 직접 복사 할 수 있습니까?

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

이 경우에는, 복사 [] 배열이 아닌 논리 소자 바이트 [] 바이트.

하지만 대소 문자를 구별합니다.

코드를 먼저 Array.Copy으로 테스트하고 확인하십시오.

+1

'BlackCopy'란 무엇입니까? – Gabe

+0

@Gabe 편집 : Black-> Block – Schultz9999

-1

복사 방법 : 가장 빠른 방법은 아무것도 복사하지 않는 것입니다.

관심있는 어레이의 일부가 변경되지 않는다고 보장 할 수 있다면 그러한 부분을 읽을 수있는 대체 인터페이스 (즉, IEnumerable<S>)를 제공 할 수 있습니다.

복사를 수행하여 다른 큰 배열을 만드는 경우 - 두 번째 부분에 대한 새 배열을 만들고 일부 인터페이스를 통해 둘 이상의 배열을 단일 엔터티로 노출하는 것을 고려하십시오.

+0

복사의 이유는 간단합니다 : lock free read를 활성화하십시오. 이러한 배열의 풀이있을 수 있으며 각각 독립적 인 스레드로 읽을 수 있습니다. 동시에 시스템은 항목의 개별 또는 하위 집합에 대한 업데이트를 가져올 수 있습니다. 업데이트를 누적하고 주기적으로 해당 내용을 독자가없는 풀의 배열 중 하나에 덤프하는 마스터 복사본이 있습니다 (판독기는 하나의 활성 배열을 기반으로 할당됩니다 - 참조 카운팅; 일단 판독기가 배열로 완료되면 자유, 따라서 새 요청에 대해 업데이트되고 활성화 될 수 있음). 따라서 어레이 업데이트에 대한이 마스터는 제가 여기서 말하고있는 것입니다. – Schultz9999

+0

항목의 기본 구조를 알지 못합니다. 나는 데이터를 분할하는 것에 대해 생각해 보았지만 불행히도 충분한 정보가 없기 때문에 성공적인 매핑을 성공적으로 만들 수 없었을 것입니다. – Schultz9999

관련 문제