2015-01-08 6 views
5

스택 교환 팀이 가장 많이 사용하는 오픈 소스 프로젝트를보고 나서. 나는 그들이 C# 함수에 인라인 된 일직선 IL 코드를 몇 번 작성했다는 것을 알아 차렸다.상위 언어보다 IL을 사용하는 경우

완벽한 예는 dapper file입니다.

내 생각에 컴파일러는 가장 효율적이라고 느끼는 코드를 생성하지 않으며 때때로 컴파일러를 위해 코드를 생성해야합니다.

내 호기심은 IL 방출기를 보통 오래된 C#보다 사용하기로 결정한 것은 언제입니까?

나는 stackexchange에 대한 예제를 알고 있지만 다른 개발자들은이 결정을 내릴 때 Sigil이 존재하는지 확인해야한다고 생각합니다.

+0

정말 갈 때, 정말 * 나쁜. 바라기를 당신은 결코 거기에 가지 않을 것이다. – BradleyDotNET

+0

예. 나는 결정을 내리는 벤치 마크를보고 싶다. – dbarnes

+8

Dapper는 런타임까지 알 수없는 유형의 코드를 동적으로 생성해야하기 때문에 IL을 사용합니다. 다른 상황에서는 IL을 사용하지 않아야합니다. –

답변

9

.NET IL은 실제 CPU 어셈블리 언어 (x86 등)에 비해 매우 간단하므로 모든 것을 거의 할 수있는 유일한 방법이 있습니다. 의미, 당신은 더 나은 일리노이 때문에 더 나은 성능을 얻을 수 없습니다. 왜냐하면 더 나은 일리노이가 없기 때문입니다. (디버그 빌드에서 의도적으로 차선의 차선책을 생성하지 않는다고 가정 해 봅시다.)

.NET 성능은 JIT-ter에 훨씬 더 의존적입니다. 어쨌든, 고급 언어, JIT-ting, GC-ing 등의 모든 아이디어. 성능 요금이 있기 때문에 일리노이에서 약간의 최적화가 너무 중요하지 않습니다.

왜 IL을 사용합니까? XSLT, 정규 표현식 또는 동적 프록시를 컴파일 할 때와 같이 코드를 생성합니다. IL에서 C# 코드를 문자열 버퍼에 작성하고 컴파일하는 것보다 훨씬 빠릅니다. 그게 전부입니다.

IL을 반드시 사용해야 할 때 코드를 생성하는 기능 외에도 IL에는 다른 장점이 있다고 생각하지 않습니다. C#은 이러한 기능이 풍부하고 빠르게 진화하는 언어입니다. 사용하지 않는 것이 미칠 것입니다. 일리노이 주에서 일하는 것은 처벌 일 것입니다. 가능한 한 좋은 IL로 C#을 컴파일 할 수 있으므로 안심할 수 있습니다.

모든 종류의 최신 C# 기능을 자유롭게 사용할 수 있습니다. 나는 동의한다, 역 동성 같이 일은 제일 성과가 있지 않을지도 모르지만, 성과에 관하여이지 않는다, 다만 당신이 재료를 완료하는 것을 돕는 현대 특징에 관하여이다. 일리노이가 그렇게주지는 않았어. (물론 새로운 기능 중 일부는 비동기와 같은 성능을 제공하지만 훨씬 높은 수준에서 어셈블리 수준의 최적화와 매우 다른 방식으로 도움이됩니다.) AFAIK는 IL을 C# 내부에 임베드 할 수 없습니다. 파일. 플라이에서 새 코드를 생성하는 것 외에도 적어도 Visual Studio에서는 IL을 어셈블리로 컴파일 할 수 없습니다. 단, C#으로 어셈블리를 만든 후에 어셈블리를 변경해야하는 경우는 제외됩니다.

+0

나는 일리노이 주 IL을 쓰면 IL opcode를 방출하기 위해 http://msdn.microsoft.com/en-us/library/system.reflection.emit.ilgenerator%28v=vs.110%29.aspx를 사용했다. – dbarnes

+0

그리고 [훨씬 간단한 방법] (http://msdn.microsoft.com/en-us/library/bb356928.aspx)을 사용하면 즉시 코드를 생성 할 수 있습니다. –

+0

예, 식 트리는 동적 조건 자 컴파일과 같은 LINQ 항목에 매우 적합합니다. 하지만 내 예제, 특히 동적 프록시의 경우 전체 클래스 및 어셈블리를 컴파일하고 인터페이스 등을 구현해야 할 때 IL 만이 유일한 옵션입니다. – fejesjoco

관련 문제