Was ist das NO_PERF Flag in reaktiven Erweiterungen Quellcode tun - c #,. NET, system.reactive, Compiler-Flags

Im ReactiveExtensions-Quellcode gibt es große Teile von Codes, die zwischen verschiedenen Implementierungen wie z

https://github.com/Reactive-Extensions/Rx.NET/blob/master/Rx.NET/Source/System.Reactive.Linq/Reactive/Linq/QueryLanguage.StandardSequenceOperators.cs

und ein Schnipsel

#if !NO_PERF
return new Distinct<TSource, TSource>(source, x => x, EqualityComparer<TSource>.Default);
#else
return Distinct_(source, x => x, EqualityComparer<TSource>.Default);
#endif

Was ist die Absicht dieser Flagge? NO_PERF und was ist der Unterschied im Verhalten zwischen der mit ihr kompilierten Bibliothek und ohne sie?

Antworten:

5 für die Antwort № 1

Als Mitglied des Rx-Teams kann ich das beantworten:

Die Antwort geht auf unsere Änderungen von Rx 1 zurück.1 bis Rx 2,0. Wir wollten, dass der alte Stil, AnonymouseObservable zu verwenden, nur für den Fall beibehalten wird, aber für die meiste Zeit möchten Sie die leistungsgesteigerte Version.

Es gibt große Unterschiede in der Leistung und in einigen Fällen eifriger Entsorgung. Sie können mehr Informationen über unsere Änderungen erfahren Hier.


2 für die Antwort № 2

Es wird verwendet, um Logik ein- / auszuwechseln, die die Sicherheit gegenüber der Leistung begünstigt. Zum Beispiel in den meisten Betreiberimplementierungen ein AnonymousObservable ist erstellt, um zu wickeln OnXXX Aufrufe und Ausnahmen bei Beobachtern abfangen.

When !NO_PERF ist wahr, dieser Wrapper wird nicht erstellt - dies verkürzt die Aufrufkette für Abfragen und führt zu weniger Objekten, weniger GC-Druck und schnellerem Code - aber es ist weniger sicher, da es wohlbehaftete Beobachter annimmt.

Dieser Code enthält viele Beispiele.

Ich weiß es nicht, aber ich kann sehen, dass es in einem anderen MS-Code verwendet wird, der ein Client von Rx ist, versteht die Konsequenzen und ist bereit, die Verantwortung für die Entwicklung wohlerzogener Kunden zu übernehmen.


Verwandte Fragen