1+ #! /bin/bash
2+
3+ # Install gnuplot
4+ sudo apt-get update && sudo apt-get install -y gnuplot
5+
6+ function extractMetric() {
7+ local file=" $1 "
8+ local metric=" $2 "
9+ grep " $metric " " $file " | awk ' {print $2}' | sed ' s/ms//'
10+ }
11+
12+ function average() {
13+ echo " $@ " | awk ' {for(i=1;i<=NF;i++) s+=$i; print s/NF}'
14+ }
15+
16+ declare -A formattedServerNames
17+ formattedServerNames=(
18+ [" tailcall" ]=" Tailcall"
19+ [" gqlgen" ]=" Gqlgen"
20+ [" apollo" ]=" Apollo GraphQL"
21+ [" netflixdgs" ]=" Netflix DGS"
22+ [" caliban" ]=" Caliban"
23+ [" async_graphql" ]=" async-graphql"
24+ [" hasura" ]=" Hasura"
25+ [" graphql_jit" ]=" GraphQL JIT"
26+ )
27+
28+ servers=(" apollo" " caliban" " netflixdgs" " gqlgen" " tailcall" " async_graphql" " hasura" " graphql_jit" )
29+ resultFiles=(" $@ " )
30+ declare -A avgReqSecs
31+ declare -A avgLatencies
32+
33+ # Extract metrics and calculate averages
34+ for idx in " ${! servers[@]} " ; do
35+ startIdx=$(( idx * 3 ))
36+ reqSecVals=()
37+ latencyVals=()
38+ for j in 0 1 2; do
39+ fileIdx=$(( startIdx + j))
40+ reqSecVals+=($( extractMetric " ${resultFiles[$fileIdx]} " " Requests/sec" ) )
41+ latencyVals+=($( extractMetric " ${resultFiles[$fileIdx]} " " Latency" ) )
42+ done
43+ avgReqSecs[${servers[$idx]} ]=$( average " ${reqSecVals[@]} " )
44+ avgLatencies[${servers[$idx]} ]=$( average " ${latencyVals[@]} " )
45+ done
46+
47+ # Generating data files for gnuplot
48+ reqSecData=" /tmp/reqSec.dat"
49+ latencyData=" /tmp/latency.dat"
50+
51+ echo " Server Value" > " $reqSecData "
52+ for server in " ${servers[@]} " ; do
53+ echo " $server ${avgReqSecs[$server]} " >> " $reqSecData "
54+ done
55+
56+ echo " Server Value" > " $latencyData "
57+ for server in " ${servers[@]} " ; do
58+ echo " $server ${avgLatencies[$server]} " >> " $latencyData "
59+ done
60+
61+ whichBench=1
62+ if [[ $1 == bench2* ]]; then
63+ whichBench=2
64+ elif [[ $1 == bench3* ]]; then
65+ whichBench=3
66+ fi
67+
68+ reqSecHistogramFile=" req_sec_histogram${whichBench} .png"
69+ latencyHistogramFile=" latency_histogram${whichBench} .png"
70+
71+ # Plotting using gnuplot
72+ gnuplot << -EOF
73+ set term pngcairo size 1280,720 enhanced font "Courier,12"
74+ set output "$reqSecHistogramFile "
75+ set style data histograms
76+ set style histogram cluster gap 1
77+ set style fill solid border -1
78+ set xtics rotate by -45
79+ set boxwidth 0.9
80+ set title "Requests/Sec"
81+ stats "$reqSecData " using 2 nooutput
82+ set yrange [0:STATS_max*1.2]
83+ set key outside right top
84+ plot "$reqSecData " using 2:xtic(1) title "Req/Sec"
85+
86+ set output "$latencyHistogramFile "
87+ set title "Latency (in ms)"
88+ stats "$latencyData " using 2 nooutput
89+ set yrange [0:STATS_max*1.2]
90+ plot "$latencyData " using 2:xtic(1) title "Latency"
91+ EOF
92+
93+ # Move PNGs to assets
94+ mkdir -p assets
95+ mv $reqSecHistogramFile assets/
96+ mv $latencyHistogramFile assets/
97+
98+ # Declare an associative array for server RPS
99+ declare -A serverRPS
100+
101+ # Populate the serverRPS array
102+ for server in " ${servers[@]} " ; do
103+ serverRPS[$server ]=${avgReqSecs[$server]}
104+ done
105+
106+ # Get the servers sorted by RPS in descending order
107+ IFS=$' \n ' sortedServers=($( for server in " ${! serverRPS[@]} " ; do echo " $server ${serverRPS[$server]} " ; done | sort -rn -k2 | cut -d' ' -f1) )
108+
109+ echo " Sorted servers: ${sortedServers[@]} "
110+ lastServer=" ${sortedServers[-1]} "
111+ lastServerReqSecs=${avgReqSecs[$lastServer]}
112+
113+ # Start building the resultsTable
114+ if [[ $whichBench == 1 ]]; then
115+ resultsTable=" <!-- PERFORMANCE_RESULTS_START -->\n\n| Query | Server | Requests/sec | Latency (ms) | Relative |\n|-------:|--------:|--------------:|--------------:|---------:|\n| $whichBench | \` { posts { id userId title user { id name email }}}\` |"
116+ elif [[ $whichBench == 2 ]]; then
117+ resultsTable=" | $whichBench | \` { posts { title }}\` |"
118+ elif [[ $whichBench == 3 ]]; then
119+ resultsTable=" | $whichBench | \` { greet }\` |"
120+ fi
121+
122+ # Build the resultsTable with sorted servers and formatted numbers
123+ for server in " ${sortedServers[@]} " ; do
124+ formattedReqSecs=$( printf " %.2f" ${avgReqSecs[$server]} | perl -pe ' s/(?<=\d)(?=(\d{3})+(\.\d*)?$)/,/g' )
125+ formattedLatencies=$( printf " %.2f" ${avgLatencies[$server]} | perl -pe ' s/(?<=\d)(?=(\d{3})+(\.\d*)?$)/,/g' )
126+ # Calculate the relative performance
127+ relativePerformance=$( echo " ${avgReqSecs[$server]} $lastServerReqSecs " | awk ' {printf "%.2f", $1 / $2}' )
128+
129+ resultsTable+=" \n|| [${formattedServerNames[$server]} ] | \` ${formattedReqSecs} \` | \` ${formattedLatencies} \` | \` ${relativePerformance} x\` |"
130+ done
131+
132+ if [[ $whichBench == 3 ]]; then
133+ resultsTable+=" \n\n<!-- PERFORMANCE_RESULTS_END -->"
134+ fi
135+
136+ echo " resultsTable: $resultsTable "
137+
138+ # Print the results table in a new file
139+ resultsFile=" results.md"
140+ echo -e $resultsTable >> $resultsFile
141+
142+
143+ if [[ $whichBench == 3 ]]; then
144+ finalResults=$( printf ' %s\n' " $( cat $resultsFile ) " | sed ' s/$/\\n/' | tr -d ' \n' )
145+ # Remove the last newline character
146+ finalResults=${finalResults::- 2}
147+
148+ # Print the results as a table in the terminal
149+ echo -e $finalResults | sed " s/<!-- PERFORMANCE_RESULTS_START-->//;s/<!-- PERFORMANCE_RESULTS_END-->//"
150+ # Check if the markers are present
151+ if grep -q " PERFORMANCE_RESULTS_START" README.md; then
152+ # Replace the old results with the new results
153+ sed -i " /PERFORMANCE_RESULTS_START/,/PERFORMANCE_RESULTS_END/c\\ $finalResults " README.md
154+ else
155+ # Append the results at the end of the README.md file
156+ echo -e " \n$finalResults " >> README.md
157+ fi
158+ fi
159+
160+ # Move the generated images to the assets folder
161+ mv $reqSecHistogramFile assets/
162+ mv $latencyHistogramFile assets/
163+
164+ # Delete the result TXT files
165+ for file in " ${resultFiles[@]} " ; do
166+ rm " $file "
167+ done
0 commit comments