โดยส่วนตัวสงสัยมานานว่าระหว่างสองตัวนี้ใครเร็วกว่ากัน เนื่องจากเดิมทีผู้เขียนเป็นคนที่ใช้ภาษา 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 ดังนี้
โดยส่วนตัวคิดว่าอาจจะเป็นเพราะ 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
Top comments (0)