2014-03-27 47 views
1

在ReactiveExtensions源代码有代码不同的实施方式之间的切换的巨大大片如什么是在反应性扩展源代码NO_PERF标志做

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的意图是什么以及在使用它编译的库和没有它的库之间的行为有什么不同。

+0

它在这里定义,但我不知道它的目的:https://github.com/Reactive-Extensions/Rx.NET/blob/master/Rx.NET/Source/Common.targets#L311 – Zache

回答

5

由于在Rx团队的一员,我可以回答这个问题:

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

这两个表现都有很大的差异,在某些情况下更加急切的处置。你可以找到更多关于我们的变化here

2

它用于切换进/出逻辑,有利于安全而不是性能。例如,在大多数运营商实施中,会创建一个AnonymousObservable来包装OnXXX调用,并在观察者中捕获异常。

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

This code has lots of examples.

我不知道,但我可以看到它正在内的其他MS代码,Rx的客户端使用,明白后果,并准备采取创造乖巧客户的责任。