Delegieren von Wertargumenten an Funktionen, die ref-Argumente akzeptieren

9

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.

    
Koby Duck 08.08.2014, 08:44
quelle

3 Antworten

0

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.

    
Koby Duck 08.08.2014, 23:38
quelle
1

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.

    
Patrick Hofman 08.08.2014 08:52
quelle
1

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.

%Vor%

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:)

    
nvoigt 08.08.2014 08:55
quelle

Tags und Links