反应式扩展源代码中的NO_PERF标志是什么

时间:2014-03-27 06:59:34

标签: c# .net system.reactive compiler-flags

在ReactiveExtensions源代码中,有大量代码在不同的实现之间切换,例如

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

和一个片段

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

这个标志NO_PERF的意图是什么,用它编译的库和没有它的库之间的行为有什么不同。

2 个答案:

答案 0 :(得分:5)

作为Rx团队的成员,我可以回答这个问题:

答案可以追溯到我们从Rx 1.1到Rx 2.0的变化。我们希望能够保持使用AnonymouseObservable的旧样式以防万一,但在大多数情况下,您需要性能增强版本。

两种表现都存在很大差异,在某些情况下会更加急切。您可以找到有关我们更改的更多信息here

答案 1 :(得分:2)

它用于切换输入/输出有利于安全性而不是性能的逻辑。例如,在大多数运算符实现中,创建AnonymousObservable来包装OnXXX调用并捕获观察者中的异常。

当!NO_PERF为true时,不会创建此包装 - 这会缩短查询的调用链,从而减少对象,减少GC压力和更快的代码 - 但是由于它假定表现良好的观察者,因此安全性较低。

This code has lots of examples.

我不知道,但我可以看到它被用在Rx的客户端的其他MS代码中,了解后果并准备承担创建行为良好的客户的责任。