golang-iterators-benchmark

command module
v0.0.0-...-ae52731 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 24, 2024 License: MIT Imports: 2 Imported by: 0

README

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.

Documentation

The Go Gopher

There is no documentation for this package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL