2009-08-19 2 views
5

배경일리노이 코드를 비교하여 어느 기술이 더 빠르고 더 좋은지 판단 할 수 있습니까?

This question 나에 대해 생각해 보았습니다. 최근에 제가 linq pad의 일리노이 기능을보고 있었기 때문에 동일한 문제에 대한 두 가지 접근 방식의 일리노이 코드를 비교해 가장 잘 판단했습니다. 제조

var arr = new string[] { "1", "2", "3", "4" }; 
var result = Array.ConvertAll(arr, s => Int32.Parse(s)); 

:

IL_0001: ldc.i4.4  
IL_0002: newarr  System.String 
IL_0007: stloc.2  
IL_0008: ldloc.2  
IL_0009: ldc.i4.0  
IL_000A: ldstr  "1" 
IL_000F: stelem.ref 
IL_0010: ldloc.2  
IL_0011: ldc.i4.1  
IL_0012: ldstr  "2" 
IL_0017: stelem.ref 
IL_0018: ldloc.2  
IL_0019: ldc.i4.2  
IL_001A: ldstr  "3" 
IL_001F: stelem.ref 
IL_0020: ldloc.2  
IL_0021: ldc.i4.3  
IL_0022: ldstr  "4" 
IL_0027: stelem.ref 
IL_0028: ldloc.2  
IL_0029: stloc.0  
IL_002A: ldloc.0  
IL_002B: ldsfld  UserQuery.CS$<>9__CachedAnonymousMethodDelegate1 
IL_0030: brtrue.s IL_0045 
IL_0032: ldnull  
IL_0033: ldftn  b__0 
IL_0039: newobj  System.Converter<System.String,System.Int32>..ctor 
IL_003E: stsfld  UserQuery.CS$<>9__CachedAnonymousMethodDelegate1 
IL_0043: br.s  IL_0045 
IL_0045: ldsfld  UserQuery.CS$<>9__CachedAnonymousMethodDelegate1 
IL_004A: call  System.Array.ConvertAll 
IL_004F: stloc.1  

b__0: 
IL_0000: ldarg.0  
IL_0001: call  System.Int32.Parse 
IL_0006: stloc.0  
IL_0007: br.s  IL_0009 
IL_0009: ldloc.0  
IL_000A: ret   

다른 않음 :

상기 연결 질문 사용

배열 변환에 대해서는, 두 답변은 IL 코드 생성

var arr = new string[] { "1", "2", "3", "4" }; 
var result = arr.Select(s => int.Parse(s)).ToArray(); 

제작 :

IL_0001: ldc.i4.4  
IL_0002: newarr  System.String 
IL_0007: stloc.2  
IL_0008: ldloc.2  
IL_0009: ldc.i4.0  
IL_000A: ldstr  "1" 
IL_000F: stelem.ref 
IL_0010: ldloc.2  
IL_0011: ldc.i4.1  
IL_0012: ldstr  "2" 
IL_0017: stelem.ref 
IL_0018: ldloc.2  
IL_0019: ldc.i4.2  
IL_001A: ldstr  "3" 
IL_001F: stelem.ref 
IL_0020: ldloc.2  
IL_0021: ldc.i4.3  
IL_0022: ldstr  "4" 
IL_0027: stelem.ref 
IL_0028: ldloc.2  
IL_0029: stloc.0  
IL_002A: ldloc.0  
IL_002B: ldsfld  UserQuery.CS$<>9__CachedAnonymousMethodDelegate1 
IL_0030: brtrue.s IL_0045 
IL_0032: ldnull  
IL_0033: ldftn  b__0 
IL_0039: newobj  System.Func<System.String,System.Int32>..ctor 
IL_003E: stsfld  UserQuery.CS$<>9__CachedAnonymousMethodDelegate1 
IL_0043: br.s  IL_0045 
IL_0045: ldsfld  UserQuery.CS$<>9__CachedAnonymousMethodDelegate1 
IL_004A: call  System.Linq.Enumerable.Select 
IL_004F: call  System.Linq.Enumerable.ToArray 
IL_0054: stloc.1  

b__0: 
IL_0000: ldarg.0  
IL_0001: call  System.Int32.Parse 
IL_0006: stloc.0  
IL_0007: br.s  IL_0009 
IL_0009: ldloc.0  
IL_000A: ret  

이 보면, 내가 말할 수있는 것은 후자의 옵션

  • 가 작성하는 첫번째 대답은
  • 하지 않는 경우
  • 는 LINQ를 사용하여 1 개 개의 여분 줄을 취한다는 것이다 다르게 IL_0039을 통해 지능의.

질문이 구체적인 예를 들어

  • , 내 가정이 정확한지?
  • 일반적으로 IL 코드를 통해 두 솔루션을 비교하는 방법은 무엇입니까?
  • 일반적으로 IL LOC가 적은 솔루션은 메모리가 더 빨리 또는 더 적게 사용된다는 의미입니까?
  • 제목에서 알 수 있듯이 일리노이 코드를 비교하여 어느 기술이 더 빠르고 더 좋은지 판단 할 수 있습니까?

FWIW, 저는 드문 경우지만 모든 토론이 직장에서 개발자들 사이에서 발생하는 경우가 종종 있습니다. 누군가는 "오 이런식이 더 효율적"이라고 말할 것이고 IL 코드를 확인하기 위해 linqpad에 던져 보겠습니다. 또한 FWIW, 나는 거의 항상 그것을 효율적/빠른 접근법을 얻기 전에 작동시키는 법을 준수합니다. 나는이 구체적인 예를 들어 :

+0

안녕, 알렌, 대단히 감사합니다! – abatishchev

답변

8
  • 을 개발하고 있어요 어떤 사람들은 내가 지속적으로 IL 코드를 비교하고있어 생각하지 않는다 그냥 그래서, 내 가정이 정확합니까?
  • 일반적으로 IL 코드를 통해 두 솔루션을 비교하는 방법은 무엇입니까?
  • 일반적으로 IL LOC가 적은 솔루션은 메모리가 더 빨리 또는 더 적게 사용된다는 의미입니까?
  • 제목에서 알 수 있듯이 일리노이 코드를 비교하여 어느 기술이 더 빠르고 더 좋은지 판단 할 수 있습니까?

1) 귀하의 가정은 현재 상황에 대해 정확합니다.

2)는 IL 코드가 "더 나은"

3) 아니, 그것을 실행하는 적은 수의 지침을 소요 의미인지를 결정하기 위해 무엇을하고 있는지 이해할 필요가있다. 그러나 이러한 개별 명령어는 더 많은 메모리 또는 그 이하의 메모리를 사용할 수 있습니다. 예를 들어, 참조하는 명령은 Func 대리자를 만드는 것이고 다른 한 가지는 Converter 개체를 만드는 것입니다. 더 많은 정보가 없으면이 두 가지 중 어느 것이 더 비쌉니까?

4) 예와 아니오 ....

문제는 IL 코드가 무슨 일이 일어나고 있는지 당신에게 말할 것입니다,하지만 정말 큰 성과 동력이 될거야 IL에서 중첩 된 전화입니다. 일리노이 코드가 모든 곳에서 간단한 작업을 수행하는 경우 일반적으로 개별 IL 연산이 속도면에서 다를 수 있지만 더 짧을수록 빠릅니다. 코드가 당신 같은 다른 타입의 메소드 나 생성자를 호출 할 때, 이것만으로는 말할 수 없게됩니다. IL의 한 줄은 한 사례에서 (예를 들어 값 비싼 방법을 호출하는 경우) 다른 사례에서 50보다 더 오래 걸릴 수 있습니다 (단순한 작업을 수행하는 경우). 지난 몇 거의 모든 실행 시간을 wheras 위의 경우

예를 들어, 처음 20 개 작업은 매우 빠르다.

+0

흥미 롭군요. 중첩 된 일리노이 호출을 모두 표시한다고 생각했습니다. 대단한 답변에 감사드립니다. 부차적 인 질문으로, 내가 일리노이에 대해 더 많이 배울 수 있는지 또는 내가 그것에 대해 너무 신경써야하는지 알고 있습니까? 미안하지만, 그것들은 일종의 질문입니다. –

+2

일리노이를 정말로 이해하려면 컴파일러 이론 및/또는 어셈블리 언어에 대해 읽어보십시오. 그것은 톤이 자신이하는 일을 파악하는 데 도움이됩니다. 그렇지 않으면 Reflection.Emit의 MSDN 섹션에 좋은 정보가 많이 있습니다. –

3

모두 답변 작품의 청크 (두번째과 IL 004F) IL 004A에서 수행된다. 이러한 외부 통화의 비용을 알지 못하는 한 두 답변의 성과를 비교할 수있는 실질적인 근거는 없습니다.

관련 문제