Frage

Ich schreibe ein XNA-Spiel, wo ich pro Pixel tue Kollisionsprüfungen. Die Schleife, die prüft dies tut dies durch eine int und bitweise ODER-Verknüpfung Verschiebung und ist in der Regel schwer zu lesen und zu verstehen.

Ich mag private Methoden hinzufügen, wie private bool IsTransparent(int pixelColorValue) die Schleife besser lesbar zu machen, aber ich will nicht den Aufwand für Methodenaufrufe, da dieser sehr leistungskritischen Code.

Gibt es eine Möglichkeit, die Compiler zu zwingen, diesen Aufruf zu Inline oder werde ich tun, ich hoffe nur, dass der Compiler diese Optimierung tun?

Wenn es keine Möglichkeit, dies zu erzwingen, ist es eine Möglichkeit, wenn das Verfahren zu prüfen, wurde inlined, kurz vor der Demontage zu lesen? Wird das Verfahren in Reflexion zeigen, wenn es inlined wurde und keine anderen Anrufer gibt es?

Edit:? Ich kann es nicht erzwingen, so kann ich es erkennen

War es hilfreich?

Lösung

Nein kann man nicht. Sogar noch mehr, wer das auf inlining entscheidet nicht VS-Compiler, der Sie Code nimmt und wandelt es in IL, aber JIT-Compiler, der IL nimmt und wandelt sie in Maschinencode. Dies liegt daran, nur die JIT-Compiler genug über die Prozessorarchitektur wissen zu entscheiden, ob ein Verfahren inline setzt geeignet ist, da es ein Kompromiss zwischen Befehl Pipelining und Cache-Größe ist.

So auch in .NET Reflector suchen, werden Sie nicht helfen.

Andere Tipps

  

"können Sie prüfen,   System.Reflection.MethodBase.GetCurrentMethod (). Name.   Wenn die Methode inlined ist, wird es   Gibt den Namen des Anrufers   statt. "

- Joel Coehoorn

Es gibt eine neue Art und Weise mehr agressive inlining in .net 4.5 zu fördern, die hier beschrieben wird: http://blogs.microsoft.co.il/blogs/sasha/archive/2012/01/20/aggressive -inlining-in-the-clr-4-5-jit.aspx

Im Grunde ist es nur ein Flag dem Compiler mitzuteilen, Inline, wenn möglich. Leider ist es in der aktuellen Version von XNA (Game Studio 4.0) nicht zur Verfügung, aber soll verfügbar sein, wenn XNA VS aufholt 2012 in diesem Jahr einige Zeit. Es ist bereits verfügbar, wenn Sie irgendwie auf Mono ausgeführt werden.

[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; 
    } 
}

Beachten Sie, dass die XBox funktioniert anders.

Eine Google diese aufgedreht:

"Die Inline-Methode, die den Aufwand eines Aufrufs eines Verfahrens mildert. JIT-Formulare in ein Inline was die folgenden Bedingungen erfüllt.

  • Die IL Codegröße ist 16 Bytes oder weniger.
  • Der Zweigbefehl nicht verwendet wird (wenn Satz usw.).
  • Die lokale Variable wird nicht verwendet.
  • Ausnahmebehandlung ist nicht durchgeführt (versuchen, zu fangen, usw.).
  • float ist nicht als Argument verwendet oder Rückgabewert einer Methode (wahrscheinlich durch die Xbox 360, nicht angewandt wird).
  • Wenn zwei oder mehrere Argumente sind in einem Verfahren, verwendet sie für die Wende erklärt.

Allerdings ist eine virtuelle Funktion nicht in ein Inline gebildet. "

http: //xnafever.blogspot .com / 2008/07 / Inline-Methode-by-XNA-on-xbox360.html

Ich habe keine Ahnung, ob er richtig ist. Anyone?

Nein, kann man nicht.

Grundsätzlich kann man tun, dass nicht in den meisten modernen C ++ Compiler entweder. inline ist nur ein Angebot an den Compiler. Es ist kostenlos, es zu nehmen oder nicht.

Die C # Compiler führen keine speziellen inlining am IL-Ebene. JIT-Optimierer ist derjenige, der es tun wird.

warum nicht unsicheren Code verwenden (inline c als bekannt) und die Verwendung von C / C ++ Stil Zeiger machen, das ist sicher vor der GC (dh nicht in Sammlungen betroffen), sondern kommt mit seiner eigenen Auswirkungen auf die Sicherheit (kippe Nutzung für Internet aber Zone Apps) ist ausgezeichnet für die Art von Sache, die es scheint, dass Sie versuchen, mit Leistung zu erzielen vor allem und noch mehr mit Arrays und bitweise Operationen?

zusammenzufassen, Sie wollen Leistung für einen kleinen Teil Ihrer App? unsicheren Code verwenden, und die Verwendung von Zeigern usw. scheint die beste Option für mich

machen

EDIT: ein bisschen ein Starter? http://msdn.microsoft.com/en-us /library/aa288474(VS.71).aspx

Der einzige Weg, dies zu überprüfen ist, erhalten oder einen Profiler zu schreiben und in die JIT Ereignisse Haken, müssen Sie auch sicherstellen, dass Inlining nicht ausgeschaltet ist, wie es standardmäßig ist, wenn Profilierungs.

Sie können es zur Laufzeit mit dem oben erwähnten GetCurrentMethod Anruf erkennen. Aber das würde scheinen ein bisschen eine Verschwendung zu sein [1]. Die einfachste Sache zu tun würde nur die MSIL ildasm und dort überprüfen.

Beachten Sie, dass diese speziell für die ist Compiler den Anruf inlining, und in den verschiedenen Reflection docs auf MSDN.

  

Wenn die Methode, die die GetCallingAssembly Methode aufruft expandiert wird inline vom Compiler (das heißt, wenn die Compiler die Funktionskörper in die ausgesendeten Microsoft Zwischensprache (MSIL) einfügt, anstatt einen Funktionsaufruf emittierend), dann die Anordnung zurück durch die GetCallingAssembly Methode ist die Anordnung der Inline-Code enthält. Dies könnte sich von der Baugruppe, die die ursprüngliche Methode enthält. Um sicherzustellen, dass ein Verfahren, das die GetCallingAssembly Methode aufruft, nicht durch den Compiler inlined ist, können Sie das Attribut MethodImplAttribute mit MethodImplOptions.NoInlining gelten.

Allerdings ist der Zitter auch kostenlose Anrufe Inline - aber ich denke, ein Disassembler der einzige Weg wäre, zu überprüfen, was ist und nicht auf dieser Ebene getan

.

Edit: Nur einige Verwirrung in diesem Thread zu klären, csc.exe wird Inline MSIL ruft -. wenn die Zitter wird (wahrscheinlich) in es aggressiver sein

[1] Und von Abfall - ich meine, dass (a), dass sie den Zweck der inlining (bessere Performance) besiegt, weil der Reflexions Lookup. Und (b), wäre es wahrscheinlich das inlining Verhalten ändern, so dass es ohnehin nicht mehr inlined. Und bevor Sie denken, Sie können es nur einschalten Debug mit einem Assert oder etwas baut -. Erkennen, dass es nicht während Debug inlined, sondern kann in Release sein

  

Gibt es eine Möglichkeit, die Compiler zu zwingen, diesen Aufruf zu Inline oder werde ich tun, ich hoffe nur, dass der Compiler diese Optimierung tun?

Wenn es billiger ist, die Funktion Inline, wird es. Also keine Sorge darüber, wenn Ihr Profiler sagt, dass es tatsächlich ein Problem ist.

Weitere Informationen

JIT-Erweiterungen in .NET 3.5 SP1

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top