Spring Boot 3.2 Native로 실행 와 Golang의 Gin, Fiber & Echo 사이의 성능을 비교해보려고 합니다.
(Java Spring Boot vs Golang Gin vs Golang Fiber vs Golang Echo)
테스트 환경
모든 테스트들은 Macbook Pro M2와 16GB RAM & 8+4 CPU cores를 썼습니다.
load tester는 Bombardier를 사용했습니다.
codesenberg/bombardier: Fast cross-platform HTTP benchmarking tool written in Go (github.com)
소프트웨어 버전은 아래와 같습니다.
- Java 21 Graal CE
- Spring Boot 3.2
- Go 1.21.5
코드는 아래와 같습니다.
Spring Boot
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.boot.web.embedded.tomcat.TomcatProtocolHandlerCustomizer;
import org.springframework.context.annotation.Bean;
import java.util.concurrent.Executors;
@SpringBootApplication
@RestController
public class HelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
@GetMapping("/")
public String handleRequest() {
return "Hello World!";
}
}
application.properties (Virtual threads are enabled)
server.port=3000
spring.threads.virtual.enabled=true
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")
}
결과
각 테스트는 50, 100 및 300개의 동시 연결에 대해 500만개의 요청을 실행하는 것으로 구성됩니다.
완전히 똑같은 상태를 비교하는 것은 아닙니다.
Spring Boot의 기능은 Gin/Fiber/Echo에 비해서 엄청나게 비대한 기능들을 모두 포함하고있습니다.
그럼에도 불구하고 Spring Boot는 Golang보다 3배 느립니다.
Go side 에서는 Gin/Fiber/Echo는 거의 성능 차이가 나지 않습니다.
Spring boot가 native로 실행되면서 JVM 사용에 비해서 메모리를 덜씁니다.
그럼에도 Golang보다 3배정도 성능이 낮고, CPU는 golang보다 반정도로 씁니다.
'백엔드 > Golang' 카테고리의 다른 글
Golang 에러 처리 - (1) Google Guide/Best Practice 찾아보기 (2) | 2024.09.07 |
---|---|
Golang zero-value 알아보기 (0) | 2024.07.09 |
Golang init() 사용법 및 주의 사항 (0) | 2024.05.16 |
우리 프로젝트에서 Golang DB 처리 시에 GORM을 사용 해야 하는 이유 (0) | 2024.05.01 |
개발 및 IT 관련 포스팅을 작성 하는 블로그입니다.
IT 기술 및 개인 개발에 대한 내용을 작성하는 블로그입니다. 많은 분들과 소통하며 의견을 나누고 싶습니다.