Leistung von == vs Entspricht in der generischen C # -Klasse

8

Aus irgendeinem Grund erlaubt C # keine Verwendung des ==-Operators in generischen Klassen wie hier:

%Vor%

Wenn ich == durch val.Equals (Wert) ersetze, habe ich Code, der wie erwartet funktioniert, aber wenn ich auf Bytecode schaue, sieht es viel komplizierter aus. Ein sehr einfacher Test, bei dem int-Variablen in der Schleife mit == und Equals () verglichen wurden, zeigte, dass die Version Equals () zweimal langsamer als die Version "==" war.

Ich frage mich, ob es eine Möglichkeit gibt, primitive Werttypen in generischen Klassen zu vergleichen, die so schnell wie == operator sind. Irgendwelche Ideen willkommen.

Bearbeiten: Ich habe mich zwischen den Timern verlaufen. Der Leistungsunterschied ist nicht so dramatisch. Hier sind meine neuesten Ergebnisse:

%Vor%

Kurz gesagt: Equals () ist gut genug.

    
Optional Option 29.12.2016, 23:19
quelle

2 Antworten

4

Der Grund dafür ist, dass == standardmäßig auf die Referenzgleichheit eingestellt ist und dies für Werttypen keinen Sinn ergibt. Die Antwort lautet immer false . Da es keinen Sprachmechanismus gibt, generische Typen basierend auf statischen Methoden einzuschränken, lässt der Compiler dies einfach zu, da nicht überprüft werden kann, ob T wirklich einen überladenen == Operator hat.

Wenn Sie andererseits T auf class beschränken, wird es gut kompiliert, weil die Referenzgleichheit für Referenztypen sinnvoll ist.

Die Lösung ist natürlich IEquatable<T> ; In jeder vernünftig implementierten Struktur gibt IEquatable<T>.Equals(T t) Ihnen eine Gleichheitssemantik und == sollte sich konsistent verhalten.

Und beantworten Sie Ihre Frage, nein gibt es nicht. Wenn Sie wirklich die Geschwindigkeit von int == int benötigen, müssen Sie eine nicht generische spezialisierte Klasse implementieren.

    
InBetween 29.12.2016, 23:28
quelle
5

Wenn Sie der Klasse die Einschränkung IEquatable<T> hinzufügen können, können Sie die in dieser Schnittstelle deklarierte Methode IEquatable<T>.Equals(T other) verwenden:

%Vor%     
Dmitry 29.12.2016 23:25
quelle

Tags und Links