- 비동기 와 멀티쓰레드 간의 메모리 사용량을 Rust, Go, Java, C#, Python, Node.js, Elixir 언어로 비교
- 10초간 기다리는 태스크를 N개 실행하는 프로그램을 각 언어로 작성(ChatGPT의 도움을 받아)
- Xeon E3 + Ubuntu 22.04 에서 비교
결과
- 최소 풋프린트 (1개의 태스크만 실험): Go 와 Rust는 3MB 이하만 요구, Python은 17MB, Java/Node.js는 약 40MB, C#은 131MB
- 1만개 태스크 : Rust Tokio 4.6MB, Rust async-std 8MB, Go 28.6MB, Python 40MB, Rust Threads 48MB, Node.js 48MB, Java Virtual Thread 78MB, Elixir 99MB, C# 131MB, Java Threads 244MB
- 10만개 태스크(쓰레드는 제외): Rust tokio 23MB, Rust Async-std 54MB, Node.js 112MB, C# 130MB, Java virtual threads 223 MB, Python 240MB, Go 269MB, Elixir 445MB
- 100만개 태스크: Rust Tokio 213MB, C# 461MB, Node.js 494MB, Rust async-std 527MB, Java virtual thread 1154MB, Python 2232MB, Go 2658MB, Elixir 4009MB
결론
- Rust tokio는 타의 추종을 불허함
- C# 이 풋프린트는 크지만, 매우 경쟁력 있음(Rust를 이기기도)
- Go 는 1백만개로 가면서 자바 가상쓰레드와 격차가 벌어짐(Go가 JVM에 비해 가볍다는 일반적인 생각을 뒤엎음)
- 메모리 사용량만 살펴본거라 다른 요소들은 고려되지 않음
- 1백만개 태스크에서는 작업을 시작하는데 오버헤드가 많아지고, 대부분의 코드가 완료하는데 12초 이상 걸림
- 다른 벤치마크도 실행할 예정