NO_PERF标志在响应式扩展源代码中的作用是什么?

本文关键字:源代码 作用 是什么 扩展 PERF 标志 响应 NO | 更新日期: 2023-09-27 17:53:45

在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的目的是什么,使用它和不使用它编译的库在行为上有什么不同

NO_PERF标志在响应式扩展源代码中的作用是什么?

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

答案可以追溯到我们从Rx 1.1到Rx 2.0的变化。为了以防万一,我们希望能够保持使用AnonymouseObservable的旧风格,但大多数时候,你想要性能增强的版本。

在性能上有很大的不同,在某些情况下有更多的急于处理。

它用于切换安全优于性能的逻辑。例如,在大多数操作符实现中,创建AnonymousObservable是为了包装OnXXX调用并捕获观察者中的异常。

当!NO_PERF为真时,不会创建这个包装器——这会缩短查询的调用链,导致更少的对象,更少的GC压力和更快的代码——但是它不太安全,因为它假设了行为良好的观察者。

这段代码有很多例子。

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