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 )