3 ms·
Speaking of "single pass", one of the criticisms I have of the "enumerator" patterns in modern programming languages is that they encourage multiple passes. As
by jiggawatts 2y ago
Speaking of "single pass", one of the criticisms I have of the "enumerator" patterns in modern programming languages is that they encourage multiple passes.
As an example: computing the .min() and .max() of an enumerable is two passes even though it could be done with one pass.
I'd love to see a language embrace a more efficient style similar to how a SQL does it, where you can elegantly request this as a single pass over the data: "SELECT min(x), max(x) FROM y"
- cerved 2y agowhat's preventing you from doing it in one pass?
- davidmurdoch 2y agoDoes C# have the plumbing for this built in? It's been 7 years since using it so I might not be remembering correctly.
- neonsunset 2y agoIEnumerable<T>.Max and .Min are the same as they were just significantly faster through the use of SIMD: https://github.com/dotnet/runtime/blob/ebbebaca1184940f06df609d5a40096f628200ce/src/libraries/System.Linq/src/System/Linq/MaxMin.cs#L22 https://github.com/dotnet/runtime/blob/ebbebaca1184940f06df6... You could implement a similar (and simpler) fast path for types with contiguous memory by performing min and max per iteration instead.
- davidmurdoch 2y agoI was thinking LINQ was optimized to do a single enumeration for cases such as this. Can LINQ be easily, naturally, and idiomatically used with `IEnumerable<T>.Max` and `.Min` to avoid looping twice, or is it more of a more rigorous and intentional optimization the engineer would have to seek out?
- _dain_ 2y agoWhat's wrong with doing it in two passes? N iterations each doing 2 operations is exactly the same cost as 2*N iterations each doing 1 operation. Because multiplication is commutative.
- buildbot 2y agoThis is true, but a big advantage of the single pass method is data reuse. Instead of loading each element twice, you load each element once. Per bit, reading/writing to external memory is massively more energy intensive than any compute op. Orders of magnitude more.
- srcreigh 2y agoIt’s more like 2NM where M is loading the data from disk/memory. One pass is 2N+M. Why go to the store and back twice to buy two things instead of buying two things in one trip? ;p
- jiggawatts 2y agoI think you meant 2N+2M vs 2N+M, but yes, that’s the point: not reading twice is cheaper because unlike in traditional big-O analysis compute is cheap but data access is very expensive.
- srcreigh 2y agoYep, thx.