문제

픽셀 당 충돌 확인을하는 XNA 게임을 작성하고 있습니다. 이것을 확인하는 루프는 int와 bitwise iring을 변화 시켜서 그렇게하고 일반적으로 읽고 이해하기가 어렵습니다.

다음과 같은 개인 방법을 추가하고 싶습니다 private bool IsTransparent(int pixelColorValue) 루프를 더 읽기 쉽게 만들려면, 이는 매우 성능에 민감한 코드이기 때문에 메소드 호출의 오버 헤드를 원하지 않습니다.

컴파일러 가이 호출을 인화하도록 강요하는 방법이 있습니까? 아니면 컴파일러 가이 최적화를 수행하기를 바랍니다.

이것을 강요 할 수있는 방법이 없다면, 분해를 읽지 않는 방법이 없어 졌는지 확인하는 방법이 있습니까? 이 방법이 감소되어 다른 발신자가 존재하지 않으면 반사에 표시됩니까?

편집하다: 강요 할 수 없으므로 감지 할 수 있습니까?

도움이 되었습니까?

해결책

아니요. 더욱이, 인라인을 결정하는 사람은 코드를 가져 와서 IL로 변환하는 컴파일러가 아니라 IL을 가져 와서 기계 코드로 변환하는 JIT 컴파일러가 아닙니다. 이는 JIT 컴파일러만이 프로세서 아키텍처에 대해 충분히 알고 메서드 인라인을 넣는 것이 명령어 파이프 라인과 캐시 크기 사이의 트레이드 오프이기 때문에 적절한 지 결정하기 때문입니다.

따라서 .NET 리플렉터를 보더라도 도움이되지 않습니다.

다른 팁

"System.Reflection.MethodBase.GetCurrentMethod (). 이름을 확인할 수 있습니다. 메소드가 상환되면 대신 발신자의 이름을 반환합니다."

--Joel Coehoorn

.NET 4.5에서 더 많은 공격적인 인라인을 장려하는 새로운 방법이 있습니다. http://blogs.microsoft.co.il/blogs/sasha/archive/2012/01/20/Aggreastive-inlining-inthe-clr-4-5-jit.aspx

기본적으로 가능한 경우 컴파일러를 인라인으로 알려주는 것은 깃발 일뿐입니다. 불행히도, 현재 버전의 XNA (Game Studio 4.0)에서는 사용할 수 없지만 XNA가 올해 2012 년까지 XNA를 따라 잡을 때 사용할 수 있어야합니다. 어떻게 든 모노에서 실행중인 경우 이미 사용할 수 있습니다.

[MethodImpl(MethodImplOptions.AggressiveInlining)] 
public static int LargeMethod(int i, int j)
{ 
    if (i + 14 > j) 
    { 
        return i + j; 
    } 
    else if (j * 12 < i) 
    { 
        return 42 + i - j * 7; 
    } 
    else 
    { 
        return i % 14 - j; 
    } 
}

Xbox가 다르게 작동한다는 점에 유의하십시오.

Google은 다음과 같습니다.

"방법의 호출 오버 헤드를 완화시키는 인라인 방법. JIT는 다음 조건을 충족시키는 인라인으로 형성합니다.

  • IL 코드 크기는 16 바이트 이하입니다.
  • 분기 명령은 사용되지 않습니다 (문장 등).
  • 로컬 변수는 사용되지 않습니다.
  • 예외 처리는 수행되지 않았습니다 (시도, 캐치 등).
  • 플로트는 메소드의 인수 또는 반환 값으로 사용되지 않습니다 (아마도 Xbox 360에 의해 적용되지 않음).
  • 두 개 이상의 인수가 방법에 있으면 선언 된 턴에 사용됩니다.

그러나 가상 기능은 인라인으로 형성되지 않습니다. "

http://xnafever.blogspot.com/2008/07/inline-method-by-xna-on-xbox360.html

그가 옳은지 모르겠습니다. 누구나?

아니, 당신은 할 수 없습니다.

기본적으로 대부분의 최신 C ++ 컴파일러에서도 그렇게 할 수 없습니다. inline 컴파일러에 대한 제안입니다. 무료로 가져 가거나 그렇지 않습니다.

C# 컴파일러는 IL 레벨에서 특별한 인라인을 수행하지 않습니다. JIT Optimizer는 그렇게 할 것입니다.

안전하지 않은 코드 (인라인 C가 알려진 것으로)를 사용하고 C/C ++ 스타일 포인터를 사용하지 않는 이유는 GC에서 안전하지만 (예 : 컬렉션의 영향을받지 않음) 자체 보안 영향 (인터넷 영역 앱에는 사용할 수 없음)이 제공됩니다. 그러나 특히 성능으로 성능을 달성하고 배열 및 비트 작동으로 달성하려고하는 것처럼 보이는 것은 탁월합니까?

요약하면 앱의 작은 부분에 대한 성능을 원하십니까? 안전하지 않은 코드를 사용하고 포인터 등을 사용하는 것 같습니다.

편집 : 약간의 스타터?http://msdn.microsoft.com/en-us/library/aa288474(vs.71).aspx

이를 확인하는 유일한 방법은 프로파일 러를 얻거나 작성하고 JIT 이벤트에 연결하는 것입니다. 또한 프로파일 링 할 때 기본적으로 인라인이 꺼지지 않도록해야합니다.

앞서 언급 한 GetCurrentMethod 호출로 런타임에 감지 할 수 있습니다. 그러나 그것은 약간의 폐기물 인 것 같습니다 [1]. 가장 쉬운 일은 MSIL을 틸다 즈마하고 거기에서 확인하는 것입니다.

이것은 특히 컴파일러 전화를 인화하고 다양한 반사 MSDN의 문서.

getCallingAssembly 메소드를 호출하는 방법이 컴파일러에 의해 인라인으로 확장되는 경우 (즉, 컴파일러가 기능 본체를 방출 된 Microsoft 중간 언어 (MSIL)에 삽입하는 경우 기능 호출을 방출하는 대신) GetCallingAssemby가 반환 한 어셈블리를 반환합니다. 방법은 인라인 코드를 포함하는 어셈블리입니다. 이것은 원래 방법을 포함하는 어셈블리와 다를 수 있습니다. getCallingAssembly 메소드를 호출하는 메소드가 컴파일러에 의해 인쇄되지 않도록하려면 MethodImplattribute 속성을 MethodImploptions.noinlining으로 적용 할 수 있습니다.

그러나 지터는 또한 인라인 호출을 자유롭게 호출 할 수 있습니다. 그러나 분리기가 해당 레벨에서 무엇이 무엇인지 확인하는 유일한 방법이라고 생각합니다.

편집 :이 스레드의 혼란을 해결하기 위해 csc.exe ~ 할 것이다 인라인 MSIL 호출 - 지터는 아마도 더 공격적 일 것입니다.

1] 그리고 폐기물에 의해 - (a) 반사 조회로 인해 인라인 (더 나은 성능)의 목적을 물리 쳤다는 것을 의미합니다. 그리고 (b) 어쨌든 더 이상 감소하지 않도록 수감 행동을 바꿀 것입니다. 그리고 당신이 생각하기 전에, 당신은 단지 인명이나 무언가를 사용하여 디버그 빌드를 켤 수 있다고 생각하기 전에 - 디버그 중에는 그것이 감소하지는 않지만 출시 될 수 있음을 깨달았습니다.

컴파일러 가이 호출을 인화하도록 강요하는 방법이 있습니까? 아니면 컴파일러 가이 최적화를 수행하기를 바랍니다.

함수를 인화하는 것이 더 저렴하다면, 그럴 것입니다. 프로파일 러가 실제로 문제라고 말하지 않는 한 걱정하지 마십시오.

자세한 내용은

.NET 3.5 SP1의 JIT 향상

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top