1 | #!/usr/bin/env bash
|
2 | #
|
3 | # Synthetic test with 1000 regexes.
|
4 | #
|
5 | # Usage:
|
6 | # benchmarks/regcomp-cache/run.sh <function name>
|
7 | #
|
8 | # Example:
|
9 | # benchmarks/regcomp-cache/run.sh match-many
|
10 |
|
11 | set -o nounset
|
12 | set -o pipefail
|
13 | set -o errexit
|
14 |
|
15 | match-many() {
|
16 | local num_pat=${1:-300}
|
17 | local num_str=${2:-300}
|
18 | local repeat=${3:-1}
|
19 |
|
20 | # 1 2 3
|
21 | local repeat_str
|
22 | repeat_str=$(seq $repeat)
|
23 |
|
24 | echo BASH_VERSION=${BASH_VERSION:-}
|
25 | echo OILS_VERSION=${OILS_VERSION:-}
|
26 |
|
27 | declare -a REGEXES=()
|
28 | for i in $(seq $num_pat); do
|
29 | REGEXES[i]="$i?($i*)$i+" # last char is modified with ? then * and +
|
30 | done
|
31 |
|
32 | echo "${REGEXES[@]}"
|
33 |
|
34 | local num_yes=0
|
35 | local num_tried=0
|
36 |
|
37 | for i in $(seq $num_str); do
|
38 | local str="$i$i$i" # 3 copies
|
39 | for j in $(seq $num_pat); do
|
40 | local re="${REGEXES[j]}"
|
41 | for k in $repeat_str; do # potentially use the cache more
|
42 | if [[ $str =~ $re ]]; then
|
43 | echo "string $str matches pattern $re - captured '${BASH_REMATCH[1]}'"
|
44 | num_yes=$(( num_yes + 1 ))
|
45 | fi
|
46 | num_tried=$(( num_tried + 1 ))
|
47 | done
|
48 | done
|
49 | done
|
50 |
|
51 | echo
|
52 | echo "num_yes = $num_yes"
|
53 | echo "num_tried = $num_tried"
|
54 | }
|
55 |
|
56 | compare() {
|
57 | # must do ./NINJA-config.sh first
|
58 |
|
59 | local bin=_bin/cxx-opt/osh
|
60 | ninja $bin
|
61 |
|
62 | local dir=_tmp/regcomp-cache
|
63 | mkdir -p $dir
|
64 |
|
65 | # with bash
|
66 | { time $0 match-many "$@"; } >$dir/bash-stdout.txt 2>$dir/bash-time.txt
|
67 |
|
68 | # with OSH
|
69 | { time $bin $0 match-many "$@"; } >$dir/osh-stdout.txt 2>$dir/osh-time.txt
|
70 |
|
71 | # should have equal output except for version
|
72 | diff $dir/*-stdout.txt || true
|
73 |
|
74 | # show timings
|
75 | head $dir/*-time.txt
|
76 | }
|
77 |
|
78 |
|
79 | "$@"
|
80 |
|