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

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

Задержки

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

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

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

Вердикт

Для простого случая использования hello world разница между фреймворками практически не заметна. Возможно, для сложных случаев разница будет более заметной (?).

Что касается использования ресурсов, то общее использование CPU у Go довольно высокое (конечно, потому что он использует больше ядер и дает больше показателей производительности), а использование памяти очень низкое.

Хотя нет смысла выбирать победителя, но если придется выбирать, то я выберу Gin. Единственная причина выбрать Gin – это его популярность и звезды GitHub.

И снова, если вам интересно подобное сравнение для фреймворков Node, вы можете посмотреть статью здесь.

Спасибо, что прочитали эту статью!

+1
5
+1
7
+1
2
+1
0
+1
4

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *