coreutils icon indicating copy to clipboard operation
coreutils copied to clipboard

`seq` performance is very poor, compared with GNU `seq`, when passed positive integer values

Open drinkcat opened this issue 7 months ago • 6 comments

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

drinkcat avatar Mar 18 '25 15:03 drinkcat