Node.js와 Java: Hello World 사례에 대한 기본 HTTP 서버 성능 비교
성능 비교 시리즈에 대한 최근 기사는 매체 커뮤니티에서 상당한 인기를 얻었습니다. 처음에는 Node/Deno/Bun의 기본 서버와 SpringBoot를 비교했습니다. 불공평한 비교라는 지적을 받았습니다. SpringBoot는 프레임워크이므로 상대 프레임워크와 비교해야 합니다. 의견을 존중하여 Express/fastify에서 실행되는 Node/Deno/Bun과 SpringBoot의 후속 비교를 수행했습니다. 여전히 양측의 기본 HTTP 서버를 비교하는 것이 매우 유용할 것이라는 의견을 받았습니다.
이 글과 몇몇 후속 기사에서는 Node.js, Deno, Bun, Go에서 제공하는 네이티브 서버와 Java의 네이티브 서버를 비교하려고 합니다. 이 기사에서는 Node의 기본 서버와 Java의 기본 서버를 비교합니다.
모든 최근 기사는 내 저자 페이지 에서 볼 수 있습니다 .
설정
테스트는 16G RAM이 장착된 MacBook Pro M1에서 실행됩니다.
소프트웨어 버전은 다음과 같습니다.
- Node.js v19.8.1
- 자바 20
Node.js
import http from "node:http";
http.createServer((req, resp) => {
try {
if (req.method !== "GET") {
return resp.writeHead(405).end();
}
if (req.url !== "/") {
return resp.writeHead(404).end();
}
resp.writeHead(200, {
"content-type": "text/plain",
});
resp.end("Hello world");
} catch (e) {
resp.writeHead(500).end();
}
}).listen(3000);
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
public class NativeHelloWorldServer {
public static void main(String[] args) throws Exception {
HttpServer server = HttpServer.create(new InetSocketAddress(3000), 0);
server.createContext("/", new MyHandler());
server.setExecutor(Executors.newCachedThreadPool());
server.start();
}
static class MyHandler implements HttpHandler {
@Override
public void handle(HttpExchange t) throws IOException {
String response = "Hello world!";
t.sendResponseHeaders(200, response.length());
OutputStream os = t.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
}
각 테스트는 5M(5백만) 요청 에 대해 실행됩니다 .
테스트는 25, 100 및 300개의 동시 연결에 대해 실행됩니다.
부하 테스트는 Bombardier HTTP 테스트 도구를 사용하여 수행됩니다.
다음은 각 동시성 수준에 대한 결과를 보여주는 표입니다.
Node의 기본 HTTP 서버는 Java의 기본 서버보다 빠른 것으로 나타났습니다. RPS든 지연 시간이든 그 차이는 크지 않지만 차이가 있습니다. 또한 Node는 CPU 및 메모리와 같은 시스템 리소스를 매우 적게 사용합니다.
승자: Node.js
Java에서 캐시된 스레드 풀 사용에 대한 논쟁이 있을 수 있습니다. 다른 옵션은 시작 시 고정 크기 스레드 풀을 할당하는 것입니다. 다음은 125개 스레드의 고정 크기 스레드 풀과 함께 100개의 동시 연결을 사용하는 빠른 테스트입니다. Java 코드의 유일한 줄 변경은 다음과 같습니다.
//server.setExecutor(Executors.newCachedThreadPool());
server.setExecutor(Executors.newFixedThreadPool(125));
고정 크기 스레드 풀로 성능 향상이 보이지 않습니다.
다음 기사에서는 Deno, Bun 및 Go에 대한 Java와의 비교가 제공됩니다.
업데이트:
- Java와 Deno의 비교는 이제 여기에서 확인할 수 있습니다.
- Java와 Bun의 비교는 이제 여기에서 확인할 수 있습니다.
- Java와 Go의 비교는 이제 여기에서 확인할 수 있습니다.

![연결된 목록이란 무엇입니까? [1 부]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































