11#! /bin/bash
22
33function extractMetric() {
4- local file=" $1 "
5- local metric=" $2 "
6- grep " $metric " " $file " | awk ' {print $2}' | sed ' s/ms//'
4+ local file=" $1 "
5+ local metric=" $2 "
6+ grep " $metric " " $file " | awk ' {print $2}' | sed ' s/ms//'
77}
88
99function average() {
10- echo " $@ " | awk ' {for(i=1;i<=NF;i++) s+=$i; print s/NF}'
10+ echo " $@ " | awk ' {for(i=1;i<=NF;i++) s+=$i; print s/NF}'
1111}
1212
1313declare -A formattedServerNames
1414formattedServerNames=(
15- [" tailcall" ]=" Tailcall"
16- [" gqlgen" ]=" Gqlgen"
17- [" apollo" ]=" Apollo GraphQL"
18- [" netflixdgs" ]=" Netflix DGS"
19- [" caliban" ]=" Caliban"
20- [" async_graphql" ]=" async-graphql"
15+ [" tailcall" ]=" Tailcall"
16+ [" gqlgen" ]=" Gqlgen"
17+ [" apollo" ]=" Apollo GraphQL"
18+ [" netflixdgs" ]=" Netflix DGS"
19+ [" caliban" ]=" Caliban"
20+ [" async_graphql" ]=" async-graphql"
21+ [" hasura" ]=" Hasura"
2122)
2223
23- servers=(" apollo" " caliban" " netflixdgs" " gqlgen" " tailcall" " async_graphql" )
24+ servers=(" apollo" " caliban" " netflixdgs" " gqlgen" " tailcall" " async_graphql" " hasura " )
2425resultFiles=(" $@ " )
2526declare -A avgReqSecs
2627declare -A avgLatencies
2728
2829# Extract metrics and calculate averages
2930for idx in " ${! servers[@]} " ; do
30- startIdx=$(( idx * 3 ))
31- reqSecVals=()
32- latencyVals=()
33- for j in 0 1 2; do
34- fileIdx=$(( startIdx + j))
35- reqSecVals+=($( extractMetric " ${resultFiles[$fileIdx]} " " Requests/sec" ) )
36- latencyVals+=($( extractMetric " ${resultFiles[$fileIdx]} " " Latency" ) )
37- done
38- avgReqSecs[${servers[$idx]} ]=$( average " ${reqSecVals[@]} " )
39- avgLatencies[${servers[$idx]} ]=$( average " ${latencyVals[@]} " )
31+ startIdx=$(( idx * 3 ))
32+ reqSecVals=()
33+ latencyVals=()
34+ for j in 0 1 2; do
35+ fileIdx=$(( startIdx + j))
36+ reqSecVals+=($( extractMetric " ${resultFiles[$fileIdx]} " " Requests/sec" ) )
37+ latencyVals+=($( extractMetric " ${resultFiles[$fileIdx]} " " Latency" ) )
38+ done
39+ avgReqSecs[${servers[$idx]} ]=$( average " ${reqSecVals[@]} " )
40+ avgLatencies[${servers[$idx]} ]=$( average " ${latencyVals[@]} " )
4041done
4142
4243# Generating data files for gnuplot
4344reqSecData=" /tmp/reqSec.dat"
4445latencyData=" /tmp/latency.dat"
4546
46- echo " Server Value" > " $reqSecData "
47+ echo " Server Value" > " $reqSecData "
4748for server in " ${servers[@]} " ; do
48- echo " $server ${avgReqSecs[$server]} " >> " $reqSecData "
49+ echo " $server ${avgReqSecs[$server]} " >> " $reqSecData "
4950done
5051
51- echo " Server Value" > " $latencyData "
52+ echo " Server Value" > " $latencyData "
5253for server in " ${servers[@]} " ; do
53- echo " $server ${avgLatencies[$server]} " >> " $latencyData "
54+ echo " $server ${avgLatencies[$server]} " >> " $latencyData "
5455done
5556
5657whichBench=1
5758if [[ $1 == bench2* ]]; then
58- whichBench=2
59+ whichBench=2
5960fi
6061
6162reqSecHistogramFile=" req_sec_histogram${whichBench} .png"
6263latencyHistogramFile=" latency_histogram${whichBench} .png"
6364
6465# Plotting using gnuplot
65- gnuplot << - EOF
66+ gnuplot << -EOF
6667 set term pngcairo size 1280,720 enhanced font "Courier,12"
6768 set output "$reqSecHistogramFile "
6869 set style data histograms
@@ -83,7 +84,6 @@ gnuplot <<- EOF
8384 plot "$latencyData " using 2:xtic(1) title "Latency"
8485EOF
8586
86-
8787# Move PNGs to assets
8888mkdir -p assets
8989mv $reqSecHistogramFile assets/
@@ -94,50 +94,66 @@ declare -A serverRPS
9494
9595# Populate the serverRPS array
9696for server in " ${servers[@]} " ; do
97- serverRPS[$server ]=${avgReqSecs[$server]}
97+ serverRPS[$server ]=${avgReqSecs[$server]}
9898done
9999
100100# Get the servers sorted by RPS in descending order
101101IFS=$' \n ' sortedServers=($( for server in " ${! serverRPS[@]} " ; do echo " $server ${serverRPS[$server]} " ; done | sort -rn -k2 | cut -d' ' -f1) )
102102
103-
104103echo " Sorted servers: ${sortedServers[@]} "
104+ lastServer=" ${sortedServers[-1]} "
105+ lastServerReqSecs=${avgReqSecs[$lastServer]}
106+
105107# Start building the resultsTable
106- resultsTable=" <!-- PERFORMANCE_RESULTS_START_${whichBench} -->\n\n| Server | Requests/sec | Latency (ms) |\n|--------:|--------------:|--------------:|"
108+ if [[ $whichBench == 1 ]]; then
109+ resultsTable=" <!-- PERFORMANCE_RESULTS_START -->\n\n| Query | Server | Requests/sec | Latency (ms) | Relative |\n|-------:|--------:|--------------:|--------------:|---------:|\n| $whichBench | \` { posts { id userId title user { id name email }}}\` |"
110+ else
111+ resultsTable=" | $whichBench | \` { posts { title }}\` |"
112+ fi
107113
108114# Build the resultsTable with sorted servers and formatted numbers
109115for server in " ${sortedServers[@]} " ; do
110116 formattedReqSecs=$( printf " %.2f" ${avgReqSecs[$server]} | perl -pe ' s/(?<=\d)(?=(\d{3})+(\.\d*)?$)/,/g' )
111117 formattedLatencies=$( printf " %.2f" ${avgLatencies[$server]} | perl -pe ' s/(?<=\d)(?=(\d{3})+(\.\d*)?$)/,/g' )
112- resultsTable+= " \n| [ ${formattedServerNames[$server]} ] | \` ${formattedReqSecs} \` | \` ${formattedLatencies} \` | "
113- done
118+ # Calculate the relative performance
119+ relativePerformance= $( echo " ${avgReqSecs[$server]} $lastServerReqSecs " | awk ' {printf "%.2f", $1 / $2} ' )
114120
115- resultsTable+=" \n\n<!-- PERFORMANCE_RESULTS_END_${whichBench} -->"
116-
117- echo -e $resultsTable
121+ resultsTable+=" \n|| [${formattedServerNames[$server]} ] | \` ${formattedReqSecs} \` | \` ${formattedLatencies} \` | \` ${relativePerformance} x\` |"
122+ done
118123
119- # Check if the markers are present
120- if grep -q " PERFORMANCE_RESULTS_START_${whichBench} " README.md; then
121- # Replace the old results with the new results
122- sed -i " /PERFORMANCE_RESULTS_START_${whichBench} /,/PERFORMANCE_RESULTS_END_${whichBench} /c\\ $resultsTable " README.md
123- else
124- # Append the results at the end of the README.md file
125- echo -e " \n$resultsTable " >> README.md
124+ if [[ $whichBench == 2 ]]; then
125+ resultsTable+=" \n\n<!-- PERFORMANCE_RESULTS_END -->"
126126fi
127127
128+ echo " resultsTable: $resultsTable "
129+
128130# Print the results table in a new file
129131resultsFile=" results.md"
130- echo -e " ## Benchmark $whichBench results\n" >> $resultsFile
131132echo -e $resultsTable >> $resultsFile
132133
133- # Print the results as a table in the terminal
134- echo -e $resultsTable | sed " s/<!-- PERFORMANCE_RESULTS_START_${whichBench} -->//;s/<!-- PERFORMANCE_RESULTS_END_${whichBench} -->//"
134+
135+ if [[ $whichBench == 2 ]]; then
136+ finalResults=$( printf ' %s\n' " $( cat $resultsFile ) " | sed ' s/$/\\n/' | tr -d ' \n' )
137+ # Remove the last newline character
138+ finalResults=${finalResults::- 2}
139+
140+ # Print the results as a table in the terminal
141+ echo -e $finalResults | sed " s/<!-- PERFORMANCE_RESULTS_START-->//;s/<!-- PERFORMANCE_RESULTS_END-->//"
142+ # Check if the markers are present
143+ if grep -q " PERFORMANCE_RESULTS_START" README.md; then
144+ # Replace the old results with the new results
145+ sed -i " /PERFORMANCE_RESULTS_START/,/PERFORMANCE_RESULTS_END/c\\ $finalResults " README.md
146+ else
147+ # Append the results at the end of the README.md file
148+ echo -e " \n$finalResults " >> README.md
149+ fi
150+ fi
135151
136152# Move the generated images to the assets folder
137153mv $reqSecHistogramFile assets/
138154mv $latencyHistogramFile assets/
139155
140156# Delete the result TXT files
141157for file in " ${resultFiles[@]} " ; do
142- rm " $file "
158+ rm " $file "
143159done
0 commit comments