coreutils
coreutils copied to clipboard
`seq` performance is very poor, compared with GNU `seq`, when passed positive integer values
GNU seq is a lot faster when passed integer parameters, without format or fixed width options.
hyperfine -L seq seq,./target/release/seq "{seq} 0 1 1000000"
Benchmark 1: seq 0 1 1000000
Time (mean ± σ): 10.8 ms ± 1.7 ms [User: 9.9 ms, System: 0.9 ms]
Range (min … max): 5.2 ms … 14.1 ms 265 runs
Benchmark 2: ./target/release/seq 0 1 1000000
Time (mean ± σ): 289.8 ms ± 3.7 ms [User: 226.3 ms, System: 63.0 ms]
Range (min … max): 286.7 ms … 297.6 ms 10 runs
Summary
seq 0 1 1000000 ran
26.80 ± 4.21 times faster than ./target/release/seq 0 1 1000000
I suspect there is some very targeted optimization going on for this most common use case, as the gap is not nearly as bad when a format is specified (or -w), or when some of the values are negative:
$ hyperfine -L seq seq,./target/release/seq "{seq} -f"%f" 0 1 1000000"
Benchmark 1: seq -f%f 0 1 1000000
Time (mean ± σ): 193.5 ms ± 3.8 ms [User: 192.6 ms, System: 0.6 ms]
Range (min … max): 190.0 ms … 204.1 ms 14 runs
Benchmark 2: ./target/release/seq -f%f 0 1 1000000
Time (mean ± σ): 313.6 ms ± 8.5 ms [User: 256.7 ms, System: 56.3 ms]
Range (min … max): 305.9 ms … 336.2 ms 10 runs
Summary
seq -f%f 0 1 1000000 ran
1.62 ± 0.05 times faster than ./target/release/seq -f%f 0 1 1000000
$ hyperfine -L seq seq,./target/release/seq "{seq} -w 0 1 1000000"
Benchmark 1: seq -w 0 1 1000000
Time (mean ± σ): 168.3 ms ± 4.6 ms [User: 167.5 ms, System: 0.5 ms]
Range (min … max): 165.0 ms … 182.7 ms 16 runs
Benchmark 2: ./target/release/seq -w 0 1 1000000
Time (mean ± σ): 325.5 ms ± 3.6 ms [User: 268.8 ms, System: 55.9 ms]
Range (min … max): 321.6 ms … 333.3 ms 10 runs
Summary
seq -w 0 1 1000000 ran
1.93 ± 0.06 times faster than ./target/release/seq -w 0 1 1000000
$ hyperfine -L seq seq,./target/release/seq "{seq} -100 1 1000000"
Benchmark 1: seq -100 1 1000000
Time (mean ± σ): 159.0 ms ± 2.9 ms [User: 157.9 ms, System: 0.9 ms]
Range (min … max): 155.7 ms … 167.7 ms 17 runs
Benchmark 2: ./target/release/seq -100 1 1000000
Time (mean ± σ): 289.1 ms ± 1.9 ms [User: 225.0 ms, System: 63.5 ms]
Range (min … max): 287.4 ms … 293.8 ms 10 runs
Summary
seq -100 1 1000000 ran
1.82 ± 0.04 times faster than ./target/release/seq -100 1 1000000