Um die Wartung in einer Bibliothek zu reduzieren, die ich gerade entwickle, versuche ich, ähnliche Funktionen an einzelne Funktionen zu delegieren. Als ein Beispiel, sagen wir, hat man einen Zweikomponentenvektor mit Add-Funktionen, die by-ref-Argumente akzeptieren, und andere, die by-value-Argumente akzeptieren. Die Idee besteht darin, die by-ref-Funktion einfach innerhalb der by-value-Funktionen aufzurufen, so dass nur die by-ref-Funktion beibehalten werden muss.
d. h.
%Vor%Das Problem ist, dass die By-Ref-Überlastfunktion nicht inline ist, was zu einem langsameren Code führt (mit Ausnahme der Nops).
Ausgabe mit aktivierten JIT-Optimierungen freigeben:
Add1:
%Vor%Add2:
%Vor%Gibt es eine Möglichkeit, den Aufruf von Add inline zu bekommen?
Beachten Sie, dass die Bibliothek .NET 4.0 erfordert, was bedeutet, dass aggressives Inlining nicht verfügbar ist.
Ich werde nur die Kugel beißen und den Code manuell inline einfügen, wo Inlining nicht automatisch ausgeführt wird und eine Aufrufanweisung wichtig wäre, wie in einer Funktion wie Add1. Automatisierte Komponententests können in diesem Fall die Problemerkennung unterstützen, so dass ein Wartungs-Albtraum kein großes Problem darstellt.
Danke für die Hilfe Leute von SO.
Versuchen Sie, aggressives Inlining zu aktivieren :
%Vor%Es weist den Compiler (oder JIT'er) an, diese Funktion zu inline einzubinden.
Hinweis: AggressiveInlining
ist neu in .NET 4.5.
Ich nehme eine wilde Vermutung und sage, dass Sie wahrscheinlich ein C ++ - Programmierer im Herzen sind. Die hier verwendeten Schlüsselwörter ref
und out
sind vollständig überflüssig. Sie können sie löschen und Ihr Code wird einwandfrei funktionieren.
Tatsächlich sehe ich keine Funktionalität, die eine einfache Version nicht bieten würde:
%Vor% Auch wenn Sie Ihre API statisch halten möchten, entfernen Sie alle ref
- und out
-Schlüsselwörter, diese sind für Ihren Code nicht erforderlich.
Bearbeiten:
Ich habe gerade gemerkt, dass Sie Strukturen (Werttypen) verwenden, also ist das, was ich vorher geschrieben habe, falsch und ich habe meinen Beitrag gelöscht. Dann habe ich noch etwas darüber nachgedacht und ich frage mich: Entweder wollen Sie, dass dies ein Werttyp ist, weil es so klein ist, dass das Kopieren schnell genug ist, oder Sie nicht. Sie haben es zu einem Werttyp gemacht und versuchen jetzt, Ihre eigene Entscheidung zu umgehen, indem Sie die Schlüsselwörter ref
und out
etwas missbrauchen.
Dies könnte leicht
sein %Vor%Wenn Sie by-reference weitergeben möchten, warum machen Sie es nicht zu einem Referenztyp? Wenn Sie das tun, dann wäre alles, was ich oben geschrieben habe, immer noch gültig:)