Skip to content
This repository was archived by the owner on Mar 17, 2025. It is now read-only.

Commit c7b3f47

Browse files
committed
Merge remote-tracking branch 'upstream/main' into k6_migration
2 parents fd5f4c8 + 0b3da29 commit c7b3f47

31 files changed

+548
-239
lines changed

.devcontainer/Dockerfile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ RUN apt-get update && apt-get install -y \
1313
wget \
1414
wrk \
1515
gnuplot \
16+
postgresql \
17+
postgresql-client \
1618
&& rm -rf /var/lib/apt/lists/*
1719

1820
# Install the latest LTS version of Node.js

.devcontainer/devcontainer.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
{
22
"name": "tc-benchmarks Codespace",
3+
"features": {
4+
"docker-from-docker": {
5+
"version": "latest",
6+
"moby": true
7+
}
8+
},
39
"build": {
410
"dockerfile": "Dockerfile",
511
"context": ".."
612
},
7-
"runArgs": [ "-v", "/var/run/docker.sock:/var/run/docker.sock" ],
13+
"runArgs": ["-v", "/var/run/docker.sock:/var/run/docker.sock"],
814
"forwardPorts": [8000, 3000],
915
"postCreateCommand": "bash ./setup.sh"
1016
}

README.md

Lines changed: 31 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -44,72 +44,46 @@ Get started with the benchmarks:
4444

4545
## Benchmark Results
4646

47-
### Test Query
48-
```graphql
49-
{
50-
posts {
51-
title
52-
}
53-
}
54-
```
55-
56-
<!-- PERFORMANCE_RESULTS_START_1 -->
57-
58-
| Server | Requests/sec | Latency (ms) |
59-
|--------:|--------------:|--------------:|
60-
| [Tailcall] | `61,351.30` | `1.61` |
61-
| [Caliban] | `9,159.82` | `11.31` |
62-
| [async-graphql] | `7,440.59` | `13.45` |
63-
| [Gqlgen] | `2,175.44` | `47.41` |
64-
| [Apollo GraphQL] | `1,779.96` | `56.03` |
65-
| [Netflix DGS] | `1,590.07` | `66.67` |
66-
67-
<!-- PERFORMANCE_RESULTS_END_1 -->
68-
69-
### Throughput (Higher is better)
47+
<!-- PERFORMANCE_RESULTS_START -->
48+
49+
| Query | Server | Requests/sec | Latency (ms) | Relative |
50+
|-------:|--------:|--------------:|--------------:|---------:|
51+
| 1 | `{ posts { id userId title user { id name email }}}` |
52+
|| [Tailcall] | `29,534.90` | `3.37` | `102.64x` |
53+
|| [Hasura] | `4,601.66` | `21.71` | `15.99x` |
54+
|| [Caliban] | `1,574.63` | `63.42` | `5.47x` |
55+
|| [async-graphql] | `1,457.27` | `68.51` | `5.06x` |
56+
|| [Gqlgen] | `641.88` | `156.54` | `2.23x` |
57+
|| [Netflix DGS] | `362.21` | `150.25` | `1.26x` |
58+
|| [Apollo GraphQL] | `287.75` | `345.31` | `1.00x` |
59+
| 2 | `{ posts { title }}` |
60+
|| [Tailcall] | `61,457.60` | `1.62` | `38.92x` |
61+
|| [Caliban] | `9,243.21` | `11.19` | `5.85x` |
62+
|| [async-graphql] | `7,321.85` | `13.66` | `4.64x` |
63+
|| [Hasura] | `5,648.75` | `17.70` | `3.58x` |
64+
|| [Gqlgen] | `2,196.22` | `46.47` | `1.39x` |
65+
|| [Apollo GraphQL] | `1,735.65` | `57.40` | `1.10x` |
66+
|| [Netflix DGS] | `1,579.14` | `69.21` | `1.00x` |
67+
68+
<!-- PERFORMANCE_RESULTS_END -->
69+
70+
71+
72+
### 1. `{posts {title body user {name}}}`
73+
#### Throughput (Higher is better)
7074

7175
![Throughput Histogram](assets/req_sec_histogram1.png)
7276

73-
### Latency (Lower is better)
77+
#### Latency (Lower is better)
7478

7579
![Latency Histogram](assets/latency_histogram1.png)
7680

77-
---
78-
79-
### Test Query
80-
```graphql
81-
{
82-
posts {
83-
id
84-
userId
85-
title
86-
user {
87-
id
88-
name
89-
email
90-
}
91-
}
92-
}
93-
```
94-
95-
<!-- PERFORMANCE_RESULTS_START_2 -->
96-
97-
| Server | Requests/sec | Latency (ms) |
98-
|--------:|--------------:|--------------:|
99-
| [Tailcall] | `29,574.10` | `3.37` |
100-
| [Caliban] | `1,573.96` | `63.43` |
101-
| [async-graphql] | `1,532.86` | `65.17` |
102-
| [Gqlgen] | `650.20` | `154.49` |
103-
| [Netflix DGS] | `361.72` | `213.06` |
104-
| [Apollo GraphQL] | `286.81` | `346.17` |
105-
106-
<!-- PERFORMANCE_RESULTS_END_2 -->
107-
108-
### Throughput (Higher is better)
81+
### 2. `{posts {title body}}`
82+
#### Throughput (Higher is better)
10983

11084
![Throughput Histogram](assets/req_sec_histogram2.png)
11185

112-
### Latency (Lower is better)
86+
#### Latency (Lower is better)
11387

11488
![Latency Histogram](assets/latency_histogram2.png)
11589

analyze.sh

Lines changed: 63 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,69 @@
11
#!/bin/bash
22

33
function 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

99
function 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

1313
declare -A formattedServerNames
1414
formattedServerNames=(
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")
2425
resultFiles=("$@")
2526
declare -A avgReqSecs
2627
declare -A avgLatencies
2728

2829
# Extract metrics and calculate averages
2930
for 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[@]}")
4041
done
4142

4243
# Generating data files for gnuplot
4344
reqSecData="/tmp/reqSec.dat"
4445
latencyData="/tmp/latency.dat"
4546

46-
echo "Server Value" > "$reqSecData"
47+
echo "Server Value" >"$reqSecData"
4748
for server in "${servers[@]}"; do
48-
echo "$server ${avgReqSecs[$server]}" >> "$reqSecData"
49+
echo "$server ${avgReqSecs[$server]}" >>"$reqSecData"
4950
done
5051

51-
echo "Server Value" > "$latencyData"
52+
echo "Server Value" >"$latencyData"
5253
for server in "${servers[@]}"; do
53-
echo "$server ${avgLatencies[$server]}" >> "$latencyData"
54+
echo "$server ${avgLatencies[$server]}" >>"$latencyData"
5455
done
5556

5657
whichBench=1
5758
if [[ $1 == bench2* ]]; then
58-
whichBench=2
59+
whichBench=2
5960
fi
6061

6162
reqSecHistogramFile="req_sec_histogram${whichBench}.png"
6263
latencyHistogramFile="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"
8485
EOF
8586

86-
8787
# Move PNGs to assets
8888
mkdir -p assets
8989
mv $reqSecHistogramFile assets/
@@ -94,50 +94,66 @@ declare -A serverRPS
9494

9595
# Populate the serverRPS array
9696
for server in "${servers[@]}"; do
97-
serverRPS[$server]=${avgReqSecs[$server]}
97+
serverRPS[$server]=${avgReqSecs[$server]}
9898
done
9999

100100
# Get the servers sorted by RPS in descending order
101101
IFS=$'\n' sortedServers=($(for server in "${!serverRPS[@]}"; do echo "$server ${serverRPS[$server]}"; done | sort -rn -k2 | cut -d' ' -f1))
102102

103-
104103
echo "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
109115
for 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 -->"
126126
fi
127127

128+
echo "resultsTable: $resultsTable"
129+
128130
# Print the results table in a new file
129131
resultsFile="results.md"
130-
echo -e "## Benchmark $whichBench results\n" >> $resultsFile
131132
echo -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
137153
mv $reqSecHistogramFile assets/
138154
mv $latencyHistogramFile assets/
139155

140156
# Delete the result TXT files
141157
for file in "${resultFiles[@]}"; do
142-
rm "$file"
158+
rm "$file"
143159
done

assets/latency_histogram1.png

1.01 KB
Loading

assets/latency_histogram2.png

-189 Bytes
Loading

assets/req_sec_histogram1.png

773 Bytes
Loading

assets/req_sec_histogram2.png

-19 Bytes
Loading

graphql/apollo_server/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ const resolvers = {
6363
host: "127.0.0.1",
6464
port: 3000,
6565
},
66-
}
66+
},
6767
);
6868
return response.data;
6969
} catch (error) {

graphql/caliban/build.sbt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ lazy val root = (project in file("."))
1111
libraryDependencies ++= Seq(
1212
"com.github.ghostdogpr" %% "caliban-quick" % "2.8.1",
1313
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-core" % "2.30.3",
14-
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.2" % Provided,
14+
"com.github.plokhotnyuk.jsoniter-scala" %% "jsoniter-scala-macros" % "2.30.3" % Provided,
1515
"org.apache.httpcomponents.client5" % "httpclient5" % "5.3.1",
1616
"dev.zio" %% "zio" % "2.1.5"
1717
)

0 commit comments

Comments
 (0)