Issue
In benchmark, I've noticed that you weren't using -p option for sd to print everything to stdout. Nevertheless, sed-commands print everything to stdout.
Also, once sd "(\w+)" "$1$1" dump.json >/dev/null is performed, every word in file is deleted. This happens because $1 is replaced by shell with (empty string) and sd performs 'in-place' (or 'inline') replacement.
Experiment
Here is my run for a simple thing
➜ ~/tmp echo '{"hello": "world"}' > test.txt
➜ ~/tmp cat test.txt
{"hello": "world"}
➜ ~/tmp hyperfine 'sd "(\w+)" "$1$1" test.txt'
Benchmark #1: sd "(\w+)" "$1$1" test.txt
Time (mean ± σ): 6.7 ms ± 1.1 ms [User: 3.2 ms, System: 1.8 ms]
Range (min … max): 5.6 ms … 12.2 ms 245 runs
➜ ~/tmp cat test.txt
{"": ""}
Please pay attention to the second cat output.
This is the reason why almost every run of sd is so fast (except the first one) — it doesn't do anything but just reading the file.
The following command should be used to compete with sed:
hyperfine 'sd -p "(\w+)" "\$1\$1" test.txt > /dev/null'
Please note the escaped groups \$1 and the preview option -p
Experiment Results
Here are my results for a 120 MB file
➜ ~/tmp l dump.json
.rw-r--r--@ 120M sergey 2 Aug 22:20 dump.json
➜ ~/tmp hyperfine \
'sed -E "s:(\w+):\1\1:g" dump.json >/dev/null' \
"sed 's:\(\w\+\):\1\1:g' dump.json >/dev/null" \
'sd -p "(\w+)" "\$1\$1" dump.json >/dev/null'
Benchmark #1: sed -E "s:(\w+):\1\1:g" dump.json >/dev/null
Time (mean ± σ): 5.724 s ± 0.056 s [User: 5.489 s, System: 0.146 s]
Range (min … max): 5.656 s … 5.849 s 10 runs
Benchmark #2: sed 's:\(\w\+\):\1\1:g' dump.json >/dev/null
Time (mean ± σ): 2.614 s ± 0.034 s [User: 2.493 s, System: 0.084 s]
Range (min … max): 2.569 s … 2.676 s 10 runs
Benchmark #3: sd -p "(\w+)" "\$1\$1" dump.json >/dev/null
Time (mean ± σ): 12.590 s ± 0.216 s [User: 12.087 s, System: 0.303 s]
Range (min … max): 12.403 s … 13.150 s 10 runs
Summary
'sed 's:\(\w\+\):\1\1:g' dump.json >/dev/null' ran
2.19 ± 0.04 times faster than 'sed -E "s:(\w+):\1\1:g" dump.json >/dev/null'
4.82 ± 0.10 times faster than 'sd -p "(\w+)" "\$1\$1" dump.json >/dev/null'
➜ ~/tmp l dump.json
.rw-r--r--@ 120M sergey 2 Aug 22:20 dump.json
Thoughts
Even if we fixed the benchmark, I do think that we are capped with pipe throughput.
UPD: Ok, apparently pipe is not a problem.
Platform
MBP 2015, 2.7 GHz Intel Core i5
Issue
In benchmark, I've noticed that you weren't using
-poption forsdto print everything to stdout. Nevertheless,sed-commands print everything to stdout.Also, once
sd "(\w+)" "$1$1" dump.json >/dev/nullis performed, every word in file is deleted. This happens because$1is replaced by shell with(empty string)andsdperforms 'in-place' (or 'inline') replacement.Experiment
Here is my run for a simple thing
Please pay attention to the second
catoutput.This is the reason why almost every run of
sdis so fast (except the first one) — it doesn't do anything but just reading the file.The following command should be used to compete with
sed:Please note the escaped groups
\$1and the preview option-pExperiment Results
Here are my results for a 120 MB file
Thoughts
Even if we fixed the benchmark, I do think that we are capped with pipe throughput.UPD: Ok, apparently pipe is not a problem.
Platform
MBP 2015, 2.7 GHz Intel Core i5