diff --git a/frameworks/gin/Dockerfile b/frameworks/gin/Dockerfile new file mode 100644 index 000000000..ddfc9d41c --- /dev/null +++ b/frameworks/gin/Dockerfile @@ -0,0 +1,11 @@ +FROM golang:1.26-alpine AS build +WORKDIR /app +COPY go.mod go.sum ./ +RUN go mod download +COPY main.go ./ +RUN CGO_ENABLED=0 go build -o server main.go + +FROM alpine:3.23 +COPY --from=build /app/server /server +EXPOSE 8080 +CMD ["/server"] diff --git a/frameworks/gin/README.md b/frameworks/gin/README.md new file mode 100644 index 000000000..b83dc5eed --- /dev/null +++ b/frameworks/gin/README.md @@ -0,0 +1,25 @@ +# gin + +Gin web framework on the Go `net/http` server, default configuration. + +## Stack + +- **Language:** Go 1.26 +- **Framework:** Gin 1.12 +- **Build:** `golang:1.26-alpine` -> `alpine:3.23` runtime + +## Endpoints + +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/pipeline` | GET | Returns `ok` (plain text) | +| `/baseline11` | GET | Sums query parameter values | +| `/baseline11` | POST | Sums query parameters + request body | +| `/json/{count}?m=N` | GET | First `count` dataset items with `total = price * quantity * m` | +| `/upload` | POST | Reads the body and returns the byte count | + +## Notes + +- Routing and path parameters through the Gin router, JSON through `c.JSON` +- Compression through the `gin-contrib/gzip` middleware +- Release mode, only the Recovery middleware is installed diff --git a/frameworks/gin/go.mod b/frameworks/gin/go.mod new file mode 100644 index 000000000..25c263453 --- /dev/null +++ b/frameworks/gin/go.mod @@ -0,0 +1,40 @@ +module httparena/gin + +go 1.25.0 + +require ( + github.com/gin-contrib/gzip v1.2.6 + github.com/gin-gonic/gin v1.12.0 +) + +require ( + github.com/bytedance/gopkg v0.1.3 // indirect + github.com/bytedance/sonic v1.15.0 // indirect + github.com/bytedance/sonic/loader v0.5.0 // indirect + github.com/cloudwego/base64x v0.1.6 // indirect + github.com/gabriel-vasile/mimetype v1.4.12 // indirect + github.com/gin-contrib/sse v1.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.30.1 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/goccy/go-yaml v1.19.2 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/quic-go/qpack v0.6.0 // indirect + github.com/quic-go/quic-go v0.59.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.3.1 // indirect + go.mongodb.org/mongo-driver/v2 v2.5.0 // indirect + golang.org/x/arch v0.22.0 // indirect + golang.org/x/crypto v0.48.0 // indirect + golang.org/x/net v0.51.0 // indirect + golang.org/x/sys v0.41.0 // indirect + golang.org/x/text v0.35.0 // indirect + google.golang.org/protobuf v1.36.10 // indirect +) diff --git a/frameworks/gin/go.sum b/frameworks/gin/go.sum new file mode 100644 index 000000000..57d8c9a4b --- /dev/null +++ b/frameworks/gin/go.sum @@ -0,0 +1,91 @@ +github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= +github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE= +github.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k= +github.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiDd5VjlgE= +github.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= +github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= +github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw= +github.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= +github.com/gin-contrib/gzip v1.2.6 h1:OtN8DplD5DNZCSLAnQ5HxRkD2qZ5VU+JhOrcfJrcRvg= +github.com/gin-contrib/gzip v1.2.6/go.mod h1:BQy8/+JApnRjAVUplSGZiVtD2k8GmIE2e9rYu/hLzzU= +github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= +github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= +github.com/gin-gonic/gin v1.12.0 h1:b3YAbrZtnf8N//yjKeU2+MQsh2mY5htkZidOM7O0wG8= +github.com/gin-gonic/gin v1.12.0/go.mod h1:VxccKfsSllpKshkBWgVgRniFFAzFb9csfngsqANjnLc= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w= +github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= +github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= +github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= +github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw= +github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY= +github.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= +go.mongodb.org/mongo-driver/v2 v2.5.0 h1:yXUhImUjjAInNcpTcAlPHiT7bIXhshCTL3jVBkF3xaE= +go.mongodb.org/mongo-driver/v2 v2.5.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= +golang.org/x/arch v0.22.0 h1:c/Zle32i5ttqRXjdLyyHZESLD/bB90DCU1g9l/0YBDI= +golang.org/x/arch v0.22.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A= +golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= +golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= +golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= +golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= +golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/frameworks/gin/main.go b/frameworks/gin/main.go new file mode 100644 index 000000000..d3e95e7e1 --- /dev/null +++ b/frameworks/gin/main.go @@ -0,0 +1,124 @@ +package main + +import ( + "encoding/json" + "io" + "net/http" + "os" + "strconv" + "strings" + + "github.com/gin-contrib/gzip" + "github.com/gin-gonic/gin" +) + +type Rating struct { + Score int `json:"score"` + Count int `json:"count"` +} + +type DatasetItem struct { + ID int `json:"id"` + Name string `json:"name"` + Category string `json:"category"` + Price int `json:"price"` + Quantity int `json:"quantity"` + Active bool `json:"active"` + Tags []string `json:"tags"` + Rating Rating `json:"rating"` +} + +type ProcessedItem struct { + DatasetItem + Total int `json:"total"` +} + +type ProcessResponse struct { + Items []ProcessedItem `json:"items"` + Count int `json:"count"` +} + +var dataset []DatasetItem + +func loadDataset() { + path := os.Getenv("DATASET_PATH") + if path == "" { + path = "/data/dataset.json" + } + data, err := os.ReadFile(path) + if err != nil { + return + } + json.Unmarshal(data, &dataset) +} + +func pipeline(c *gin.Context) { + c.String(http.StatusOK, "ok") +} + +func baseline11(c *gin.Context) { + sum := 0 + for _, values := range c.Request.URL.Query() { + for _, v := range values { + if n, err := strconv.Atoi(v); err == nil { + sum += n + } + } + } + if c.Request.Method == http.MethodPost { + body, err := io.ReadAll(c.Request.Body) + if err == nil { + if n, err := strconv.Atoi(strings.TrimSpace(string(body))); err == nil { + sum += n + } + } + } + c.String(http.StatusOK, strconv.Itoa(sum)) +} + +func jsonItems(c *gin.Context) { + count, _ := strconv.Atoi(c.Param("count")) + if count < 0 { + count = 0 + } + if count > len(dataset) { + count = len(dataset) + } + m, err := strconv.Atoi(c.DefaultQuery("m", "1")) + if err != nil || m == 0 { + m = 1 + } + + items := make([]ProcessedItem, count) + for i := 0; i < count; i++ { + d := dataset[i] + items[i] = ProcessedItem{DatasetItem: d, Total: d.Price * d.Quantity * m} + } + c.JSON(http.StatusOK, ProcessResponse{Items: items, Count: count}) +} + +func upload(c *gin.Context) { + size, err := io.Copy(io.Discard, c.Request.Body) + if err != nil { + c.String(http.StatusBadRequest, "0") + return + } + c.String(http.StatusOK, strconv.FormatInt(size, 10)) +} + +func main() { + loadDataset() + + gin.SetMode(gin.ReleaseMode) + r := gin.New() + r.Use(gin.Recovery()) + r.Use(gzip.Gzip(gzip.DefaultCompression)) + + r.GET("/pipeline", pipeline) + r.GET("/baseline11", baseline11) + r.POST("/baseline11", baseline11) + r.GET("/json/:count", jsonItems) + r.POST("/upload", upload) + + r.Run(":8080") +} diff --git a/frameworks/gin/meta.json b/frameworks/gin/meta.json new file mode 100644 index 000000000..c7b828155 --- /dev/null +++ b/frameworks/gin/meta.json @@ -0,0 +1,19 @@ +{ + "display_name": "gin", + "language": "Go", + "type": "flagship", + "mode": "standard", + "engine": "net/http", + "description": "Gin web framework on the Go net/http server, default configuration. Routing and path/query binding through the Gin API, encoding/json via c.JSON, gzip through the gin-contrib/gzip middleware.", + "repo": "https://github.com/gin-gonic/gin", + "enabled": true, + "tests": [ + "baseline", + "pipelined", + "limited-conn", + "json", + "json-comp", + "upload" + ], + "maintainers": [] +} diff --git a/site/data/frameworks.json b/site/data/frameworks.json index 7f879a980..c8a9c7073 100644 --- a/site/data/frameworks.json +++ b/site/data/frameworks.json @@ -401,6 +401,14 @@ "engine": "genhttp", "mode": "standard" }, + "gin": { + "dir": "gin", + "description": "Gin web framework on the Go net/http server, default configuration. Routing and path/query binding through the Gin API, encoding/json via c.JSON, gzip through the gin-contrib/gzip middleware.", + "repo": "https://github.com/gin-gonic/gin", + "type": "flagship", + "engine": "net/http", + "mode": "standard" + }, "go-fasthttp": { "dir": "go-fasthttp", "description": "High-performance Go HTTP server using fasthttp with zero-allocation design and buffer reuse.", diff --git a/site/data/results/gin.json b/site/data/results/gin.json new file mode 100644 index 000000000..b83070ecf --- /dev/null +++ b/site/data/results/gin.json @@ -0,0 +1,243 @@ +{ + "framework": "gin", + "results": { + "baseline-4096": { + "framework": "gin", + "language": "Go", + "rps": 520987, + "avg_latency": "7.85ms", + "p99_latency": "117.40ms", + "cpu": "3620.3%", + "memory": "205MiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "58.61MB/s", + "input_bw": "40.25MB/s", + "reconnects": 0, + "status_2xx": 2604936, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "baseline-512": { + "framework": "gin", + "language": "Go", + "rps": 317796, + "avg_latency": "1.61ms", + "p99_latency": "12.60ms", + "cpu": "2397.0%", + "memory": "84MiB", + "connections": 512, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "35.75MB/s", + "input_bw": "24.55MB/s", + "reconnects": 0, + "status_2xx": 1588982, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "json-4096": { + "framework": "gin", + "language": "Go", + "rps": 164735, + "avg_latency": "23.07ms", + "p99_latency": "623.40ms", + "cpu": "2651.9%", + "memory": "156MiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "571.84MB/s", + "input_bw": "7.86MB/s", + "reconnects": 32848, + "status_2xx": 823675, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "json-comp-16384": { + "framework": "gin", + "language": "Go", + "rps": 182155, + "avg_latency": "88.62ms", + "p99_latency": "812.10ms", + "cpu": "5658.5%", + "memory": "1.9GiB", + "connections": 16384, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "246.32MB/s", + "input_bw": "13.55MB/s", + "reconnects": 27950, + "status_2xx": 910779, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "json-comp-4096": { + "framework": "gin", + "language": "Go", + "rps": 175221, + "avg_latency": "22.83ms", + "p99_latency": "467.70ms", + "cpu": "5515.3%", + "memory": "858MiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "236.65MB/s", + "input_bw": "13.03MB/s", + "reconnects": 34716, + "status_2xx": 876107, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "json-comp-512": { + "framework": "gin", + "language": "Go", + "rps": 168676, + "avg_latency": "3.03ms", + "p99_latency": "55.10ms", + "cpu": "5276.2%", + "memory": "365MiB", + "connections": 512, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "227.85MB/s", + "input_bw": "12.55MB/s", + "reconnects": 33706, + "status_2xx": 843384, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "limited-conn-4096": { + "framework": "gin", + "language": "Go", + "rps": 166236, + "avg_latency": "24.07ms", + "p99_latency": "253.50ms", + "cpu": "2118.5%", + "memory": "68MiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "18.70MB/s", + "input_bw": "12.84MB/s", + "reconnects": 83165, + "status_2xx": 831180, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "limited-conn-512": { + "framework": "gin", + "language": "Go", + "rps": 145860, + "avg_latency": "3.50ms", + "p99_latency": "37.10ms", + "cpu": "2004.2%", + "memory": "60MiB", + "connections": 512, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "16.41MB/s", + "input_bw": "11.27MB/s", + "reconnects": 72914, + "status_2xx": 729302, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "pipelined-4096": { + "framework": "gin", + "language": "Go", + "rps": 1209519, + "avg_latency": "40.47ms", + "p99_latency": "1.79s", + "cpu": "4485.3%", + "memory": "328MiB", + "connections": 4096, + "threads": 64, + "duration": "5s", + "pipeline": 16, + "bandwidth": "136.05MB/s", + "reconnects": 0, + "status_2xx": 6047595, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "pipelined-512": { + "framework": "gin", + "language": "Go", + "rps": 834021, + "avg_latency": "9.70ms", + "p99_latency": "163.90ms", + "cpu": "3353.2%", + "memory": "96MiB", + "connections": 512, + "threads": 64, + "duration": "5s", + "pipeline": 16, + "bandwidth": "93.82MB/s", + "reconnects": 0, + "status_2xx": 4170108, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "upload-256": { + "framework": "gin", + "language": "Go", + "rps": 2890, + "avg_latency": "81.73ms", + "p99_latency": "306.80ms", + "cpu": "3977.3%", + "memory": "65MiB", + "connections": 256, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "347.69KB/s", + "input_bw": "22.92GB/s", + "reconnects": 2862, + "status_2xx": 14510, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + }, + "upload-32": { + "framework": "gin", + "language": "Go", + "rps": 2454, + "avg_latency": "13.00ms", + "p99_latency": "36.80ms", + "cpu": "2251.5%", + "memory": "41MiB", + "connections": 32, + "threads": 64, + "duration": "5s", + "pipeline": 1, + "bandwidth": "295.28KB/s", + "input_bw": "19.46GB/s", + "reconnects": 2456, + "status_2xx": 12271, + "status_3xx": 0, + "status_4xx": 0, + "status_5xx": 0 + } + } +} diff --git a/site/static/logs/baseline/4096/gin.log b/site/static/logs/baseline/4096/gin.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/baseline/512/gin.log b/site/static/logs/baseline/512/gin.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/json-comp/16384/gin.log b/site/static/logs/json-comp/16384/gin.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/json-comp/4096/gin.log b/site/static/logs/json-comp/4096/gin.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/json-comp/512/gin.log b/site/static/logs/json-comp/512/gin.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/json/4096/gin.log b/site/static/logs/json/4096/gin.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/limited-conn/4096/gin.log b/site/static/logs/limited-conn/4096/gin.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/limited-conn/512/gin.log b/site/static/logs/limited-conn/512/gin.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/pipelined/4096/gin.log b/site/static/logs/pipelined/4096/gin.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/pipelined/512/gin.log b/site/static/logs/pipelined/512/gin.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/upload/256/gin.log b/site/static/logs/upload/256/gin.log new file mode 100644 index 000000000..e69de29bb diff --git a/site/static/logs/upload/32/gin.log b/site/static/logs/upload/32/gin.log new file mode 100644 index 000000000..e69de29bb