在ReactiveExtensions源代码中,有大量代码在不同的实现之间切换,例如
和一个片段
#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
的意图是什么,用它编译的库和没有它的库之间的行为有什么不同。
答案 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代码中,了解后果并准备承担创建行为良好的客户的责任。