Skip to content

Commit c004a89

Browse files
committed
More benchmarks
1 parent 8ac084f commit c004a89

14 files changed

+351
-27
lines changed

benches/bench.sh

+42-7
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,53 @@ set -eu
55
COMMAND=$1
66
NUMBER=0
77

8-
RESULTS_DIR=target/benches
9-
RESULTS_FILE=$RESULTS_DIR/$COMMAND.md
8+
NO_TEST=
9+
SETUP=
10+
CLEANUP=
11+
12+
no_test() {
13+
NO_TEST=$1
14+
}
15+
16+
setup() {
17+
SETUP=$1
18+
}
19+
20+
cleanup() {
21+
CLEANUP=$1
22+
}
1023

1124
bench() {
1225
NUMBER=$((NUMBER + 1))
26+
27+
[ "$CLEANUP" ] && set -- --cleanup "$CLEANUP" "$@"
28+
[ "$SETUP" ] && set -- --setup "$SETUP" "$@"
1329
set -- hyperfine --warmup 5 "$@"
1430

1531
echo
1632
echo "## Benchmark #$NUMBER"
33+
34+
if [ "$NO_TEST" ]; then
35+
echo "> **Note:** $NO_TEST"
36+
fi
37+
1738
echo
1839
echo "Command:"
1940
echo
2041
echo '```shell'
21-
bench_command "$@"
42+
43+
preview "$@"
44+
2245
echo
2346
echo '```'
2447
echo
2548
echo "Results:"
2649
echo
27-
bench_results "$@"
50+
51+
execute "$@"
2852
}
2953

30-
bench_command() {
54+
preview() {
3155
printf "%s" "$1"
3256
shift
3357

@@ -39,15 +63,26 @@ bench_command() {
3963
printf "%s %s" "$1" "$2"
4064
shift 2
4165
;;
66+
--setup | --cleanup)
67+
printf "%s \"%s\"" "$1" "$(escape "$2")"
68+
shift 2
69+
;;
4270
*)
43-
printf "\"%s\"" "$1"
71+
printf "\"%s\"" "$(escape "$1")"
4472
shift
4573
;;
4674
esac
4775
done
4876
}
4977

50-
bench_results() {
78+
escape() {
79+
echo "$1" | sed 's/"/\\"/g'
80+
}
81+
82+
RESULTS_DIR=target/benches
83+
RESULTS_FILE=$RESULTS_DIR/$COMMAND.md
84+
85+
execute() {
5186
mkdir -p "$RESULTS_DIR"
5287
echo >&2
5388
"$@" --sort mean-time --export-markdown "$RESULTS_FILE" 1>&2

benches/commands/loop.sh

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# shellcheck shell=sh
2+
3+
bench \
4+
"rew loop 10 <$SVEJK_FILE" \
5+
"for((i=0;i<10;i++)); do cat $SVEJK_FILE; done"

benches/commands/lower.sh

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# shellcheck shell=sh
2+
3+
for FILE in "$SVEJK_FILE" "$RUR_FILE"; do
4+
bench \
5+
"rew lower <$FILE" \
6+
"sed 's/\(.*\)/\L\1/' <$FILE" \
7+
"while IFS= read -r l;do printf '%s\\n' \"\${l,,}\";done <$FILE"
8+
done
9+
10+
for FILE in "$SVEJK_FILE" "$RUR_FILE"; do
11+
setup "rew ascii <$FILE | rew loop 20 >data.txt"
12+
cleanup "rm data.txt"
13+
bench \
14+
"rew lower <data.txt" \
15+
"dd conv=lcase <data.txt" \
16+
"tr '[:upper:]' '[:lower:]' <data.txt" \
17+
"sed 's/\(.*\)/\L\1/' <data.txt" \
18+
"while IFS= read -r l;do printf '%s\\n' \"\${l,,}\";done <data.txt"
19+
done

benches/commands/skip.sh

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# shellcheck shell=sh
2+
3+
for FILE in "$SVEJK_FILE" "$RUR_FILE"; do
4+
bench \
5+
"tail -n +2001 <$FILE" \
6+
"coreutils tail -n +2001 <$FILE" \
7+
"rew skip 2000 <$FILE"
8+
done

benches/commands/stream.sh

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# shellcheck shell=sh
2+
3+
bench \
4+
"rew stream {1..100000}" \
5+
"printf '%s\n' {1..100000}"

benches/commands/upper.sh

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# shellcheck shell=sh
2+
3+
for FILE in "$SVEJK_FILE" "$RUR_FILE"; do
4+
no_test "\`sed\` and \`bash\` produce slightly different results for characters like \`ß\`"
5+
bench \
6+
"rew lower <$FILE" \
7+
"sed 's/\(.*\)/\U\1/' <$FILE" \
8+
"while IFS= read -r l;do printf '%s\\n' \"\${l^^}\";done <$FILE"
9+
done
10+
11+
for FILE in "$SVEJK_FILE" "$RUR_FILE"; do
12+
setup "rew ascii <$FILE | rew loop 20 >data.txt"
13+
cleanup "rm data.txt"
14+
bench \
15+
"rew upper <data.txt" \
16+
"dd conv=ucase <data.txt" \
17+
"tr '[:lower:]' '[:upper:]' <data.txt" \
18+
"sed 's/\(.*\)/\U\1/' <data.txt" \
19+
"while IFS= read -r l;do printf '%s\\n' \"\${l^^}\";done <data.txt"
20+
done

benches/setup.sh

+4-9
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,8 @@ specs 'tr --version'
4949

5050
BASE_DATA_URL=https://jpikl.github.io/data
5151

52-
SVEJK_REPEAT=100
53-
SVEJK_INIT="curl $BASE_DATA_URL/$SVEJK_FILE | rew loop $SVEJK_REPEAT >$SVEJK_FILE"
54-
55-
RUR_REPEAT=1000
56-
RUR_INIT="curl $BASE_DATA_URL/$RUR_FILE | rew loop $RUR_REPEAT >$RUR_FILE"
52+
SVEJK_INIT="curl $BASE_DATA_URL/$SVEJK_FILE >$SVEJK_FILE"
53+
RUR_INIT="curl $BASE_DATA_URL/$RUR_FILE >$RUR_FILE"
5754

5855
[ -f "$SVEJK_FILE" ] || sh -c "$SVEJK_INIT"
5956
[ -f "$RUR_FILE" ] || sh -c "$RUR_INIT"
@@ -68,15 +65,13 @@ echo "$SVEJK_INIT"
6865
echo '```'
6966
echo
7067
echo "- UTF-8, non-ascii (czech diacritics)"
71-
echo "- 5913 lines (repeated $SVEJK_REPEAT times)"
72-
echo "- Very long lines (up to 4952 chars)"
68+
echo "- 5913 very long lines (each up to 4952 chars)"
7369
echo "- Trimmed whitespaces"
7470
echo
7571
echo '```shell'
7672
echo "$RUR_INIT"
7773
echo '```'
7874
echo
7975
echo "- UTF-8, non-ascii (czech diacritics)"
80-
echo "- 4477 lines (repeated $RUR_REPEAT times)"
81-
echo "- Short lines (up to 81 chars)"
76+
echo "- 4477 short lines (each up to 81 chars)"
8277
echo "- Untrimmed whitespaces"

benches/test.sh

+31
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,39 @@ RESET="\e[0m"
1010
COMMAND=$1
1111
NUMBER=0
1212

13+
SETUP=
14+
CLEANUP=
15+
NO_TEST=
16+
17+
no_test() {
18+
NO_TEST=true
19+
}
20+
21+
setup() {
22+
SETUP=$1
23+
}
24+
25+
cleanup() {
26+
CLEANUP=$1
27+
}
28+
29+
reset() {
30+
NO_TEST=
31+
SETUP=
32+
CLEANUP=
33+
}
34+
1335
bench() {
1436
NUMBER=$((NUMBER + 1))
1537

38+
if [ "$NO_TEST" ]; then
39+
reset
40+
return
41+
fi
42+
1643
echo
1744
printf "%bTesting %s benchmark #%s%b\n" "$BLUE" "$COMMAND" "$NUMBER" "$RESET"
45+
sh -c "$SETUP"
1846

1947
FIRST="$1"
2048
FIRST_RESULT=$(sh -c "$FIRST | cksum")
@@ -34,11 +62,14 @@ bench() {
3462
"$RED" "$RESET" \
3563
"$BLUE" "$OTHER" "$RESET" \
3664
"$BLUE" "$FIRST" "$RESET"
65+
sh -c "$CLEANUP"
3766
exit 1
3867
fi
3968
done
4069

4170
printf "%bSUCCESS%b\n" "$GREEN" "$RESET"
71+
sh -c "$CLEANUP"
72+
reset
4273
}
4374

4475
# shellcheck disable=SC1090

docs/benchmarks/rew-loop.md

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# rew loop
2+
3+
This page contains benchmarks for [rew loop](../reference/rew-loop.md) command.
4+
5+
See [benchmark setup](./setup.md) for information about testing environemt and input data files.
6+
7+
## Benchmark #1
8+
9+
Command:
10+
11+
```shell
12+
hyperfine \
13+
--warmup 5 \
14+
"rew loop 10 <svejk.txt" \
15+
"for((i=0;i<10;i++)); do cat svejk.txt; done"
16+
```
17+
18+
Results:
19+
20+
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
21+
|:---|---:|---:|---:|---:|
22+
| `rew loop 10 <svejk.txt` | 134.5 ± 7.2 | 127.8 | 159.8 | 1.00 |
23+
| `for((i=0;i<10;i++)); do cat svejk.txt; done` | 209.0 ± 5.6 | 202.0 | 220.9 | 1.55 ± 0.09 |

docs/benchmarks/rew-lower.md

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
# rew lower
2+
3+
This page contains benchmarks for [rew lower](../reference/rew-lower.md) command.
4+
5+
See [benchmark setup](./setup.md) for information about testing environemt and input data files.
6+
7+
## Benchmark #1
8+
9+
Command:
10+
11+
```shell
12+
hyperfine \
13+
--warmup 5 \
14+
"rew lower <svejk.txt" \
15+
"sed 's/./\l&/g' <svejk.txt" \
16+
"sed 's/\(.*\)/\L\1/' <svejk.txt" \
17+
"while IFS= read -r l;do printf '%s\n' \"${l,,}\";done <svejk.txt"
18+
```
19+
20+
Results:
21+
22+
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
23+
|:---|---:|---:|---:|---:|
24+
| `rew lower <svejk.txt` | 13.5 ± 0.8 | 12.3 | 15.8 | 1.00 |
25+
| `sed 's/\(.*\)/\L\1/' <svejk.txt` | 207.8 ± 2.7 | 205.3 | 212.9 | 15.34 ± 0.88 |
26+
| `while IFS= read -r l;do printf '%s\n' "${l,,}";done <svejk.txt` | 244.7 ± 2.6 | 237.3 | 247.0 | 18.06 ± 1.02 |
27+
| `sed 's/./\l&/g' <svejk.txt` | 285.8 ± 13.3 | 277.5 | 321.6 | 21.10 ± 1.53 |
28+
29+
## Benchmark #2
30+
31+
Command:
32+
33+
```shell
34+
hyperfine \
35+
--warmup 5 \
36+
"rew lower <rur.txt" \
37+
"sed 's/./\l&/g' <rur.txt" \
38+
"sed 's/\(.*\)/\L\1/' <rur.txt" \
39+
"while IFS= read -r l;do printf '%s\n' \"${l,,}\";done <rur.txt"
40+
```
41+
42+
Results:
43+
44+
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
45+
|:---|---:|---:|---:|---:|
46+
| `rew lower <rur.txt` | 2.6 ± 0.4 | 2.1 | 5.3 | 1.00 |
47+
| `sed 's/\(.*\)/\L\1/' <rur.txt` | 28.5 ± 1.2 | 26.4 | 31.8 | 10.91 ± 1.72 |
48+
| `sed 's/./\l&/g' <rur.txt` | 32.5 ± 0.8 | 30.6 | 34.9 | 12.43 ± 1.91 |
49+
| `while IFS= read -r l;do printf '%s\n' "${l,,}";done <rur.txt` | 74.6 ± 2.4 | 69.2 | 80.7 | 28.51 ± 4.42 |
50+
51+
## Benchmark #3
52+
53+
Command:
54+
55+
```shell
56+
hyperfine \
57+
--warmup 5 \
58+
--setup "rew ascii <svejk.txt | rew loop 20 >data.txt" \
59+
--cleanup "rm data.txt" \
60+
"rew lower <data.txt" \
61+
"dd conv=lcase <data.txt" \
62+
"tr '[:upper:]' '[:lower:]' <data.txt"
63+
```
64+
65+
Results:
66+
67+
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
68+
|:---|---:|---:|---:|---:|
69+
| `rew lower <data.txt` | 10.3 ± 0.8 | 9.3 | 13.0 | 1.00 |
70+
| `tr '[:upper:]' '[:lower:]' <data.txt` | 28.0 ± 1.1 | 26.0 | 30.5 | 2.71 ± 0.23 |
71+
| `dd conv=lcase <data.txt` | 146.5 ± 3.5 | 140.3 | 153.8 | 14.19 ± 1.09 |
72+
73+
## Benchmark #4
74+
75+
Command:
76+
77+
```shell
78+
hyperfine \
79+
--warmup 5 \
80+
--setup "rew ascii <rur.txt | rew loop 20 >data.txt" \
81+
--cleanup "rm data.txt" \
82+
"rew lower <data.txt" \
83+
"dd conv=lcase <data.txt" \
84+
"tr '[:upper:]' '[:lower:]' <data.txt"
85+
```
86+
87+
Results:
88+
89+
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
90+
|:---|---:|---:|---:|---:|
91+
| `rew lower <data.txt` | 2.6 ± 0.3 | 2.1 | 5.0 | 1.00 |
92+
| `tr '[:upper:]' '[:lower:]' <data.txt` | 5.5 ± 0.5 | 4.8 | 7.3 | 2.11 ± 0.33 |
93+
| `dd conv=lcase <data.txt` | 18.8 ± 1.1 | 17.0 | 24.9 | 7.23 ± 1.03 |

0 commit comments

Comments
 (0)