4.x: Optimize Concat(IObservable<IObservable<T>>) #491
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR implements the
Concat(IObservable<IObservable<T>>)
directly in an inlined (less allocation and indirection) and lock-free fashion. (The original was delegated toMerge(sources, 1)
which I'd assume has more overhead because dealing with an arbitrary max-concurrency requires a lot of work in Rx.NET too.)I didn't add extra unit tests as this code is meant to be a drop-in replacement of the previous delegated version and is supposed to be well tested already on its own, right?
There is one scenario that I'm not sure about: where both the outer and the current inner sources signal an
OnError
, it is not expected the outer error to stop the inner sequence immediately, and whoever's error wins, that is signaled on the boundary between two inner sources. Either I happened to implement this replacement correctly, or the behavior is not verified or specified for this operator.