Go กับ Java ใครเร็วกว่า (แบบ Native)

Rawin Ngamloet
2 min readJan 12, 2021

โดยส่วนตัวสงสัยมานานว่าระหว่างสองตัวนี้ใครเร็วกว่ากัน เนื่องจากเดิมทีผู้เขียนเป็นคนที่ใช้ภาษา Java มาอย่างยาวนาน ผ่านร้อนผ่านหนาวมาประมาณหนึ่ง ช่วงหลังๆ มาเริ่มได้ยินกิตติศัพท์ที่เลื่องลือของภาษา Go ที่ทาง Google ได้นำเสนอมาตลอด (รวมไปถึงน้องๆ Programmer ที่รู้จักกันอยู่บ้าง) ว่ามันช่างมีความรวดเร็ว และง่ายในการใช้งาน ก็เลยคันไม้คันมืออยากที่จะทดสอบซักหน่อย

บริบทของการทดสอบ

ในการทดสอบ ผู้เขียนใช้ Framework เพื่อเริ่มการทำงานในส่วนของ REST Microservice โดยภาษา Java จะใช้ Quarkus และ Go เราจะใช้ Gin

ในส่วนของการทดสอบเราจะใช้โปรแกรม wrk ทดสอบความสามารถในการรองรับ โดยใช้คำสั่ง

wrk -c1000 -d10 -t10 http://localhost:8080/ping

โดยสำหรับ URL : http://localhost:8080/ping เป็นคืนค่า JSON: { “message” : “pong” } กลับมา

ผลลัพท์ของทั้งสองโปรแกรมให้ดูดังนี้

  1. ในส่วนของ Go

Running 10s test @ http://localhost:8080/ping
10 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 7.92ms 7.27ms 100.85ms 60.64%
Req/Sec 3.06k 1.58k 7.97k 51.94%
305741 requests in 10.10s, 41.11MB read
Socket errors: connect 759, read 95, write 0, timeout 0
Requests/sec: 30259.64
Transfer/sec: 4.07MB

2. ส่วนข้างล่างเป็นของ Java

Running 10s test @ http://localhost:8080/ping
10 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 25.64ms 72.74ms 989.09ms 90.21%
Req/Sec 4.75k 3.96k 27.19k 80.02%
457231 requests in 10.07s, 43.17MB read
Socket errors: connect 759, read 95, write 0, timeout 0
Requests/sec: 45404.83
Transfer/sec: 4.29MB

ก็ทดลองยิงอยู่หลายครั้งนะครับ ผลสรุปเท่าที่ทำการทดลองก็คือ Java จะรันค่อนข้างไวกว่า Go เยอะมาก (30Krps เทียบกับ 45Krps) อนึ่งการทดสอบนี้ผมใช้เครื่อง Macbook Pro 13" Quadcore 2.5Ghz Ram 16 ขนาดทดลองเปิดพัดลม Fullblast ตลอดเวลาครับ โดยผมทิ้ง Link ไปยัง Github ที่เก็บ Source code ดังนี้

  1. Go: https://github.com/daftyw/go-rest
  2. Java: https://github.com/daftyw/quarkus-reactive-rest

โดยส่วนตัวคิดว่าอาจจะเป็นเพราะ Framework ในส่วนของ Go นั้นยังทำมาไม่ไวพอ ถ้าใครมี Framework ที่เร็วๆ รบกวนช่วยแนะนำ หรือรู้วิธีปิด Log ใน Gin ช่วยทิ้งไว้ในคอมเมนท์ด้วยนะครับ

แล้วพบกันใหม่ครับ สวัสดีครับ

หลังจากได้ Feedback มาว่าให้ลองใช้ fasthttp ผมได้ลองทำการค้นคว้าเพิ่มแล้วลองทำดูได้ผลลัพท์ดังนี้ครับ

Running 10s test @ http://localhost:8080/ping
10 threads and 1000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.17ms 198.45us 10.97ms 80.12%
Req/Sec 12.34k 4.13k 22.79k 75.44%
1115359 requests in 10.10s, 153.17MB read
Socket errors: connect 759, read 88, write 0, timeout 0
Requests/sec: 110399.21
Transfer/sec: 15.16MB

ดังนั้นถือว่าชัดเจนครับ 45K rps เจอ 110K rps 5555

แล้วก็อย่างเคยครับ นี่คือ Repo ที่เก็บ Code Test: https://github.com/daftyw/go-rest2

--

--

Rawin Ngamloet

My software development career got a head start when my dad bought back the Atari machine 30 years ago