-
Notifications
You must be signed in to change notification settings - Fork 5
Benchmarks for a few iterator patterns in Go
License
ewencp/golang-iterators-benchmark
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
A simple evaluation of iterators in Go. Run like this: go test -bench . Example output: goos: darwin goarch: arm64 pkg: github.com/ewencp/golang-iterators-benchmark cpu: Apple M2 Max BenchmarkIntsCallbackIterator BenchmarkIntsCallbackIterator-12 3093 347019 ns/op BenchmarkDataCallbackIterator BenchmarkDataCallbackIterator-12 2554 469291 ns/op BenchmarkIntsBuiltinPushIterator BenchmarkIntsBuiltinPushIterator-12 616 1919919 ns/op BenchmarkDataBuiltinPushIterator BenchmarkDataBuiltinPushIterator-12 1976 600099 ns/op BenchmarkIntsBuiltinPullIterator BenchmarkIntsBuiltinPullIterator-12 27 42105520 ns/op BenchmarkDataBuiltinPullIterator BenchmarkDataBuiltinPullIterator-12 27 42632287 ns/op BenchmarkIntsBuiltinPullManualIterator BenchmarkIntsBuiltinPullManualIterator-12 618 1922295 ns/op BenchmarkDataBuiltinPullManualIterator BenchmarkDataBuiltinPullManualIterator-12 603 1963053 ns/op BenchmarkIntsChannelIterator BenchmarkIntsChannelIterator-12 8 138480906 ns/op BenchmarkDataChannelIterator BenchmarkDataChannelIterator-12 8 139482448 ns/op BenchmarkIntsBufferedChannelIterator BenchmarkIntsBufferedChannelIterator-12 25 46171112 ns/op BenchmarkDataBufferedChannelIterator BenchmarkDataBufferedChannelIterator-12 25 45705008 ns/op BenchmarkIntsClosureIterator BenchmarkIntsClosureIterator-12 619 1922210 ns/op BenchmarkDataClosureIterator BenchmarkDataClosureIterator-12 580 2046098 ns/op BenchmarkIntStatefulIterator BenchmarkIntStatefulIterator-12 586 2039062 ns/op BenchmarkDataStatefulIterator BenchmarkDataStatefulIterator-12 616 1933832 ns/op BenchmarkIntStatefulIteratorInterface BenchmarkIntStatefulIteratorInterface-12 589 2048435 ns/op BenchmarkDataStatefulIteratorInterface BenchmarkDataStatefulIteratorInterface-12 612 1925972 ns/op PASS ok github.com/ewencp/golang-iterators-benchmark 24.387s Explanation of iterator types: CallbackIterator: A callback function is passed in which is invoked once for each element. BuiltinPushIterator: Uses the 1.23+ iter.Seq function type to use natural-looking for-range loops. BuiltinPullIterator: Uses the 1.23+ iter.Pull wrapper of the BuiltinPushIterator to do pull-based iteration. BuiltinPullManualIterator: Implements the pull-based iteration manually, avoiding channels overhead of the iter.Pull wrapper version. ChannelIterator: Returns a channel as the iterator, using a background goroutine to "generate" the values, allowing for natural looking for-range loop. BufferedChannelIterator: Same as ChannelIterator but with channeled buffer of 50 elements. ClosureIterator: Externally, the user gets a function to call which raturns (element, has_next), and should only proceed if has_next is true. Actual iteration is more complex requiring 3-clause for loop or an extra conditional inside the loop body because of this additional check. Closure refers to the internal implementation. StatefulIterator: Returns an iterator struct, requiring the user to store the variable and perform Next() and Value() method calls to iterate over elements. StatefulIteratorInterface: Same as StatefulIterator but the returned type is an interface rather than a specific struct type. Note that the Builtin* iterators are actually doing more than the rest since they allow stopping iteration.
About
Benchmarks for a few iterator patterns in Go
Resources
License
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published