본문 바로가기
Rust/각종 테스트

Rust axum VS Java Spring boot 속도 테스트

by lms0806 2025. 4. 4.
728x90
반응형

rust 백엔드는 java 백엔드보다 빠를까? 라는 이야기로 간단하게 테스트를 해보았습니다.

  • Rust는 axum 0.8.3을 사용하였습니다.
  • Java는 Spring boot Web 3.4.4를 사용하였습니다.

open api를 활용하여 하고자 하였으나, 초당 건수 제한과 총 건수 제한으로 인하여 간단한 로직을 구성한 후, 테스트를 진행하였습니다.

 

test는 jemter를 사용하였습니다.

설정

Numbeer of Threads = 50
seconds = 60
Loop Count = Infinite
Duration : 180
  • Spring boot
처리량 : 85527, tps : 473.2/sec
처리량 : 83539, tps : 462.6/sec
처리량 : 83999, tps : 465.0/sec
  • Rust
처리량 : 109820, tsp : 609.1/sec
처리량 : 106814, tsp : 592.6/sec
처리량 : 106209, tsp : 589.0/sec

코드

  • java
package Main;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SearchController {

    public static class FibRequest {
        private int n;
        public int getN() {
            return n;
        }
        public void setN(int n) {
            this.n = n;
        }
    }

    private long fib(int n) {
        if (n < 2) {
            return n;
        }
        return fib(n - 1) + fib(n - 2);
    }

    @PostMapping("/")
    public String heavyFib(@RequestBody FibRequest request) {
        long result = fib(request.getN());
        return "Hello - Fibonacci(" + request.getN() + ") = " + result;
    }
}
  • rust
use axum::{Router, extract::Json, routing::post};
use serde::Deserialize;

#[derive(Deserialize)]
struct Input {
    n: u64,
}

fn fib(n: u64) -> u64 {
    if n < 2 {
        n as u64
    } else {
        fib(n - 1) + fib(n - 2)
    }
}

async fn heavy_fib(Json(input): Json<Input>) -> String {
    let result = fib(input.n);
    format!("Hello - Fibonacci({}) = {}", input.n, result)
}

#[tokio::main]
async fn main() {
    let app = Router::new().route("/", post(heavy_fib));

    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

단순한 피보나치 수열 재귀코드로 작성하여 테스트했을 뿐인데도, Spring boot랑 Rust axum이랑 속도차이가 발생했습니다.

 

만약 여기서 더 복잡한 연산을 수핸하는 로직의 경우, 차이가 더 심하게 발생할 것으로 예상됩니다.

번외

단순 피보나치 수열만 수행하는 코드를 rust랑 java 언어적 측면으로만 테스트해보았습니다.

  • java
484.7087ms
475.8897ms
477.8727ms
  • rust
386.3824ms
386.3958ms
391.9414ms

코드

  • java
public class Main {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        for(int i = 1; i < 40; i++) {
            fib(i);
        }
        System.out.println(System.currentTimeMillis() - start);
    }

    private static long fib(int n) {
        if (n < 2) {
            return n;
        }
        return fib(n - 1) + fib(n - 2);
    }
}
  • rust
use std::time::Instant;

fn fib(n: u64) -> u64 {
    if n < 2 {
        n as u64
    } else {
        fib(n - 1) + fib(n - 2)
    }
}

fn main() {
    let start = Instant::now();
    for i in 1..40 {
        fib(i);
    }

    let duration = start.elapsed();
    println!("코드 실행 시간: {:?}", duration)
}
728x90
반응형

댓글