F# sequence expressions, under the covers, are complicated beasts; for the purposes of today's exercise, the factor of interest is that they
Dispose() internal enumerators aggressively, unlike in the C# case, so the simple
Ratchet wrapper isn't enough by itself. So, with some refactoring, we get
Note that this version closes the stream after the iteration completes -- we could leave the management of the stream entirely outside the iterator if we wished. Since we are re-using our
Enumerator instance, we only have the one left for garbage collection, so suppressing the disposal doesn't litter too badly.
Overall, if you're in the simple use-case of pulling chunks out of a file in order, the earlier version of the system will suffice.
Edit 1-May-11 : Comparing with 2#4u's
Seq.breakBy I get on my laptop
- Real: 00:00:03.948, CPU: 00:00:03.946 for
- Real: 00:00:00.345, CPU: 00:00:00.374 for
- Real: 00:00:00.910, CPU: 00:00:00.904 for
making the functional
Chunk.Window implementation about 2.4 times slower than the faster -- but with more internal mutability -- of the the two.