Go: Самый быстрый веб-фреймворк в 2024 году

После потрясающей реакции на статью о самом быстром веб-фреймворке Node.js, я решил сделать то же самое для Go. В этой статье я собираюсь сравнить Gin, Fiber, Echo, Chi, HttpRouter, Iris и Beego для простого hello world.
Испытательная установка
Все тесты выполнены на MacBook Pro M2 с 16 Гб оперативной памяти, 8+4 ядра СPU. Нагрузочный тестер – Bombardier (также написан на Go). Версия Go – v1.21.6 .
Код каждого приложения выглядит следующим образом:
Gin
package main
import (
"net/http"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.New()
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Hello world!")
})
r.Run(":3000")
}
Fiber
package main
import (
"github.com/gofiber/fiber"
)
func main() {
app := fiber.New()
port := ":3000"
app.Get("/", func(c *fiber.Ctx) error {
return c.SendString("Hello World!")
})
app.Listen(port)
}
Echo
package main
import (
"net/http"
"github.com/labstack/echo"
)
func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello World!")
})
e.Start(":3000")
}
Iris
package main
import "github.com/kataras/iris/v12"
func main() {
app := iris.New()
app.Get("/", func(ctx iris.Context) {
ctx.Text("Hello World!")
})
app.Listen(":3000")
}
Chi
package main
import (
"net/http"
"github.com/go-chi/chi/v5"
)
func main() {
r := chi.NewRouter()
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World!"))
})
http.ListenAndServe(":3000", r)
}
Http Router
package main
import (
"fmt"
"net/http"
"log"
"github.com/julienschmidt/httprouter"
)
func Hello(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
fmt.Fprintf(w, "Hello World!")
}
func main() {
router := httprouter.New()
router.GET("/", Hello)
log.Fatal(http.ListenAndServe(":3000", router))
}
Beego
package main
import web "github.com/beego/beego/v2/server/web"
type MainController struct {
web.Controller
}
func (c *MainController) Get() {
c.Ctx.WriteString("Hello world!")
}
func main() {
web.Router("/", &MainController{})
web.Run()
}
app.conf
httpport = 3000
runmode = prod
Результаты
Всего выполняется 10 млн запросов для 100 одновременных соединений. Наряду с задержкой я также собрал данные об использовании процессора и памяти.Просто иметь высокий RPS недостаточно. RPS — это количество запросов, получаемых сервером за одну секунду. Это общепринятая единица измерения нагрузки на сервер.
Результаты в виде графика выглядят следующим образом:
Затраченное время и RPS


Задержки






Использование ресурсов


Вердикт
Для простого случая использования hello world разница между фреймворками практически не заметна. Возможно, для сложных случаев разница будет более заметной (?).
Что касается использования ресурсов, то общее использование CPU у Go довольно высокое (конечно, потому что он использует больше ядер и дает больше показателей производительности), а использование памяти очень низкое.
Хотя нет смысла выбирать победителя, но если придется выбирать, то я выберу Gin. Единственная причина выбрать Gin – это его популярность и звезды GitHub.
И снова, если вам интересно подобное сравнение для фреймворков Node, вы можете посмотреть статью здесь.
Спасибо, что прочитали эту статью!