มีคำถามเกี่ยวกับการเขียนโปรแกรมด้วยภาษา Java
ว่าการใช้ for-loop ปกติกับการใช้ Stream API นั้น
อะไรที่มี performance ดีกว่ากัน
ตอบได้เลยว่า for-loop เร็วสุด ๆ
แต่อาจจะต้องมองมุมอื่นด้วย ทั้งเรื่องของ readable, safety, maintain
รวมไปถึงความต้องการของงานต่าง ๆ
แต่เพื่อให้ชัดเจนมาทำ benchmark เพื่อวัดระสิทธิภาพการทำงานดีกว่า
โดยถ้าสาย JVM น่าจะต้องใช้เครื่องมือที่มีให้เลย
คือ JMH (Java Microbenchmark Harness)
จะทำการสร้างชุดการทดสอบ ทดสอบ และวิเคราะห์และสรุปผลให้
เป็นเครื่องมือที่พลาดไม่ได้เลย
โดยที่ JMH ก็เตรียม plugin สำหรับเครื่องมือต่าง ๆ ไว้ให้ครบ
เช่น
- Gradle Plugin
- Scala SBT Plugin
- IntelliJ IDEA Plugin
ยกตัวอย่าง ผมใช้งานร่วมกับ Gradle
มี code ตัวอย่างดังนี้
[gist id="141f169fdb2651b24f5e1dbff0b5b987" file="Hello.java"]คำอธิบาย
- ในทุก ๆ method ที่จะทำการ benchmark จะต้องใส่ annotation ชื่อว่า Benchmark
- กำหนดให้ทุก ๆ method วัดความเร็วการทำงานในหน่วน manosecond
- Mode การ run ใช้แบบค่า average หรือค่าเฉลี่ย
ทำการ run ด้วย Gradle
จะใช้เวลาทดสอบนานใช้ได้เลย ได้ผลการทำงานดังนี้
คำอธิบาย
- For-loop แบบปกติทำงานเร็วที่สุด
- ส่วน Stream แบบ parallel จะรองลงมา
ในส่วนตรงนี้ผมแสดงให้เห็นถึงเครื่องมือในการทำ benchmark ด้วย JMH
ลองนำไปประยุกต์ใช้งานกันดูได้นะครับ
ส่วน code ตัวอย่างอยู่ที่ GitHub::Up1