2017-12-11 7 views
0

나는 스타일로 몇 가지 코드를 작성되었습니다C#을 튜플, 건설 해체 성능

a1 = b1; 
a2 = b2; 
a3 = b3; 
... 
an = bn; 

는 갑자기 실현이 나를 위해, 내가 현재의 알고리즘을 (쓰고 컨텍스트에 대한 ...)는의 형태로 이러한 과제의 일부를 작성하는 더 심미적으로 만족입니다 : 이제

(a1, a2, a3, ..., an) = (b1, b2, b3, ..., bn); 

, 내가 코드를 작성하는이 방법은 성능에 미칠 수있는 영향에 대해 알고 싶습니다. 여기에 튜플의 구조 - 해체가 컴파일러에 의해 최적화 될 수 있다고 가정합니다. 하지만 그렇지 않은 것일까 요? b1, b2, ..., bn은 값 또는 표현식 일 수 있습니다. 또한 최적화를 수행 할 수 없다면 n의 크기가 중요 할 것입니다 (제 생각에는).

구체적인 질문이 있습니다. 가능한 모든 세부 정보를 고려하여 코드 작성의 두 가지 방법에 대한 성능 차이를 설명 할 수 있습니까?

미리 감사드립니다.

+1

왜 벤치마킹하지 않습니까? – Sweeper

+0

@Sweeper 누군가가 이미 그것을하지 못했다면, 나는 그렇게 할거라고 생각합니다. 아니면 IL을 확인하십시오. –

+0

두 가지 방법으로 코드를 작성했습니다. ** 두 가지 방법으로 실행하면 어느 쪽이 더 빨랐는지 알 수 있습니다 **. 모든 관련 세부 사항을 아는 사람은 우리가 아니라 * 당신 *입니다. –

답변

5

이렇게 사용하면 컴파일러가이 모든 것을 제거하기 때문에 실제로는 ValueTuple이 아닙니다.

비교 및 ​​대조 IL :

IL_0001: ldc.i4.1  
IL_0002: stloc.0  // a 
IL_0003: ldc.i4.2  
IL_0004: stloc.1  // b 
IL_0005: ldc.i4.3  
IL_0006: stloc.2  // c 
IL_0007: ldc.i4.4  
IL_0008: stloc.3  // d 
,536 :

IL_0001: ldc.i4.1  
IL_0002: stloc.0  // a 
IL_0003: ldc.i4.2  
IL_0004: stloc.1  // b 
IL_0005: ldc.i4.3  
IL_0006: stloc.2  // c 
IL_0007: ldc.i4.4  
IL_0008: stloc.3  // d 

var (a, b, c, d) = (1, 2, 3, 4); 

가 진행에

var a = 1; 
var b = 2; 
var c = 3; 
var d = 4; 

을 간다

같은.

이렇게 ... 일단 컴파일러가 마술을하면, 그것은 단지 스타일 선택입니다.