OILS / benchmarks / compute / control_flow.sh View on Github | oils.pub

109 lines, 67 significant
1#!/usr/bin/env bash
2#
3# Usage:
4# benchmarks/compute/control_flow.sh <function name>
5
6# Each of these 3 functions is a double loop that computes roughly n^2.
7
8do_continue() {
9 local n=$1
10 local i=0
11 local sum=0
12
13 while test $i -lt $n; do
14 local j=0
15
16 while test $j -lt $n; do
17 j=$(( j + 1 ))
18 sum=$((sum + 1))
19
20 # This NO-OP continue penalizes OSH! It's almost as fast as bash without
21 # it, but them becomes twice as slow.
22
23 continue
24 done
25
26 i=$(( i + 1 ))
27
28 done
29
30 echo " sum=$sum"
31}
32
33do_break() {
34 local n=$1
35 local i=0
36 local sum=0
37
38 while test $i -lt $n; do
39 local j=0
40
41 while test $j -lt $n; do
42 j=$(( j + 1 ))
43 sum=$((sum + 1))
44
45 # Extra break statement! Expensive in OSH!
46 if test $j -eq $i; then
47 break;
48 fi
49 continue
50 done
51
52 i=$(( i + 1 ))
53
54 done
55
56 echo " sum=$sum"
57}
58
59inner_loop_return() {
60 # relies on dynamic scope
61 if true; then
62 sum=$((sum + 1))
63
64 # test extra return. This is expensive in OSH!
65 return
66 fi
67}
68
69do_return() {
70 local n=$1
71 local i=0
72 local sum=0
73
74 while test $i -lt $n; do
75 local j=0
76
77 while test $j -lt $n; do
78 j=$(( j + 1 ))
79 inner_loop_return
80 done
81
82 i=$(( i + 1 ))
83
84 done
85
86 echo " sum=$sum"
87}
88
89do_none() {
90 local n=$1
91 local i=0
92 local sum=0
93
94 while test $i -lt $n; do
95 local j=0
96
97 while test $j -lt $n; do
98 j=$(( j + 1 ))
99 sum=$((sum + 1))
100 done
101
102 i=$(( i + 1 ))
103
104 done
105
106 echo " sum=$sum"
107}
108
109"$@"