1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors-elton

Клонировать/Скачать
performances.md 6.8 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 04.06.2025 23:59 7f2703a
description
Проверка производительности

Производительность elton является важным аспектом, который интересует многих. Ниже приведены несколько тестовых сценариев, выполненных на тестовом сервере (4 ядра, 8 потоков, 8 ГБ оперативной памяти), при использовании версии Go 1.14:

package main

import (
	"bytes"

	"github.com/vicanso/elton"
)

func main() {
	d := elton.New()

	d.GET("/", func(c *elton.Context) (err error) {
		c.BodyBuffer = bytes.NewBufferString("Hello, World!")
		return
	})
	err := d.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}
wrk -c 1000 -t 10 --latency 'http://127.0.0.1:3000/'
Running 10s test @ http://127.0.0.1:3000/
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    11.24ms   12.07ms 127.54ms   87.12%
    Req/Sec    11.39k     2.60k   33.20k    74.42%
  Latency Distribution
     50%    7.24ms
     75%   13.95ms
     90%   26.98ms
     99%   56.30ms
  1129086 requests in 10.09s, 139.98MB read
Requests/sec: 111881.19
Transfer/sec:     13.87MB

Из приведенных выше тестов видно, что сервер может обрабатывать около 110 000 запросов в секунду. Хотя это выглядит впечатляюще, на практике такой тест не имеет большого значения, но все же он может дать уверенность в том, что elton не будет тормозить производительность.

Одним из ключевых преимуществ elton является обработка промежуточных слоев (middleware) при ответе на запросы. Это позволяет просто и эффективно возвращать как успешные, так и ошибочные ответы. Давайте проверим производительность этих двух сценариев.

package main

import (
	"strings"
)	"github.com/vicanso/elton"
	"github.com/vicanso/elton/middleware"
	"github.com/vicanso/hes"
)

type (
	HelloWord struct {
		Content string  `json:"content,omitempty"`
		Size    int     `json:"size,omitempty"`
		Price   float32 `json:"price,omitempty"`
		VIP     bool    `json:"vip,omitempty"`
	}
)

func main() {
	d := elton.New()

	arr := make([]string, 0)
	for i := 0; i < 100; i++ {
		arr = append(arr, "Цветы увяли, осталась молодая слива. Время прилета птиц, зелёная вода обтекает дом. Ветки сирени опадают, где не найти благоухающих цветов?")
	}
	content := strings.Join(arr, "\n")

	d.Use(middleware.NewDefaultError())
	d.Use(middleware.NewDefaultResponder())

	d.GET("/", func(c *elton.Context) (err error) {
		c.Body = &HelloWord{
			Content: content,
			Size:    100,
			Price:   10.12,
			VIP:     true,
		}
		return
	})

	d.GET("/error", func(c *elton.Context) (err error) {
		err = hes.New("abcd")
		return
	})
	err := d.ListenAndServe(":3000")
	if err != nil {
		panic(err)
	}
}
``````bash
wrk -c 1000 -t 10 --latency 'http://127.0.0.1:3000/'
Running 10s test @ http://127.0.0.1:3000/
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    46.41ms   58.15ms 606.12ms   83.56%
    Req/Sec     4.22k   798.75     7.18k    69.90%
  Latency Distribution
     50%   15.31ms
     75%   79.23ms
     90%  129.41ms
     99%  240.98ms
  420454 requests in 10.07s, 4.26GB read
Requests/sec:  41734.70
Transfer/sec:    432.80MB
wrk -c 1000 -t 10 --latency 'http://127.0.0.1:3000/error'
Running 10s test @ http://127.0.0.1:3000/error
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    11.29ms   11.36ms 146.95ms   86.59%
    Req/Sec    10.91k     2.37k   21.86k    70.08%
  Latency Distribution
     50%    7.62ms
     75%   14.23ms
     90%   26.56ms
     99%   53.32ms
  1083752 requests in 10.10s, 142.63MB read
  Non-2xx or 3xx responses: 1083752
Requests/sec: 107344.19
Transfer/sec:     14.13MB

При сериализации структуры для нормального возврата (размер данных 10 КБ) производительность снижается, но все же можно обрабатывать 41 000 запросов в секунду. Производительность обработки ошибок выше, и она способна обрабатывать 107 000 запросов в секунду.---

Вот результаты тестирования для gin:

package main

import (
	"strings"

	"github.com/gin-gonic/gin"
)

type (
	HelloWord struct {
		Content string  `json:"content,omitempty"`
		Size    int     `json:"size,omitempty"`
		Price   float32 `json:"price,omitempty"`
		VIP     bool    `json:"vip,omitempty"`
	}
)

func main() {

	arr := make([]string, 0)
	for i := 0; i < 100; i++ {
		arr = append(arr, "Цветы увяли, осталась лишь молодая слива. Время прилетает, и вода окружает дом. Ветер сносит листья, и где бы ни было, цветы всегда есть!")
	}
	content := strings.Join(arr, "\n")

	router := gin.New()

	router.GET("/", func(c *gin.Context) {
		c.JSON(200, &HelloWord{
			Content: content,
			Size:    100,
			Price:   10.12,
			VIP:     true,
		})
	})
	router.Run(":3000")
}
wrk -c 1000 -t 10 --latency 'http://127.0.0.1:3000/'
Running 10s test @ http://127.0.0.1:3000/
  10 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    52.17ms   66.58ms 629.46ms   83.46%
    Req/Sec     3.97k     0.91k   13.91k    72.16%
  Latency Distribution
     50%   16.37ms
     75%   89.93ms
     90%  145.96ms
     99%  277.75ms
  394628 requests in 10.10s, 4.00GB read
Requests/sec:  39075.49
Transfer/sec:    405.90MB

Из приведенных выше данных видно, что производительность gin в целом соответствует производительности elton, поэтому не стоит сильно беспокоиться о вопросах производительности. Важно отметить, что elton больше не использует httprouter для обработки маршрутов, что позволяет поддерживать больше пользовательских обработчиков для маршрутов, но это приводит к снижению производительности при поиске маршрутов.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mirrors-elton.git
git@api.gitlife.ru:oschina-mirror/mirrors-elton.git
oschina-mirror
mirrors-elton
mirrors-elton
master