ใน Java ใช้ NIO หรือ IO ดีกว่ากัน

ใน Java มี 2 ทางเลือกในการใช้งานไอโอ (I/O) คือ ไอโอ (IO) กับ เอ็นไอโอ (NIO) โดยเอ็นไอโอนั้นสามารถเลือกได้ว่าจะใช้งานแบบบล็อกกิ้ง (blocking) หรือไม่ โดยส่วนมากเลือกใช้เอ็นไอโอเพียงเพราะว่าใหม่กว่า น่าจะต้องดีกว่า จึงเกิดคำถามในการออกแบบโปรแกรมว่า แบบไหนดีกว่ากัน เมื่อค้นหาข้อมูลจึงพบการวิเคราะห์ที่น่าสนใจในบล็อก jenkov.com

ไอโอจะใช้สตรีม (stream) เป็นหลัก ในขณะทีเอ็นไอโอนั้นจะใช้งาน(ไบต์)บัฟเฟอร์ (ByteBuffer) เป็นหลัก ส่วนการทำงานแบบน็อนบล็อกกิ้ง (non-blocking) จะใช้งานผ่านเซเล็กเตอร์ (Selector) ซึ่งข้อดีก็คือสามารถควบคุมการทำงานได้มากกว่า 1 แชนแนล (channel)

บ่อยครั้งที่เขียนโปรแกรม พยายามที่จะใช้เอ็นไอโอแต่เนื่องจากข้อมูลในบัฟเฟอร์มีอยู่มาก เพื่อความสมบูรณ์ของข้อมูล ยังไงก็ต้องวนรอบ (loop) การส่งด้วยคำสั่ง ByteBuffer.hasRemaining() และ ByteBuffer.flush() อยู่ดี จึงอาจจะไม่เกิดประโยชน์ที่จะมาใช้งานน็อนบล็อกกิ้ง การเขียนโปรแกรมโดยใช้เอ็นไอโอนั้นทำให้โครงสร้างโปรแกรมซับซ้อนขึ้นมามาก

ตอนท้ายของบล็อกอ้างอิงได้สรุปแบบเข้าใจง่ายๆว่า

  • เอ็นไอโอเหมาะกับการกระจายข้อมูลเล็กๆไปยังหลายแชนแนลพร้อมๆกัน เช่น ระบบแชท หรือ ระบบพีทูพี (P2P: Peer-to-peer) จึงสามารถใช้ประโยชน์ของน็อนบล็อกกิ้งได้เต็มประสิทธิภาพมากกว่า
  • ไอโอเหมาะกับการใช้แชนแนลน้อยๆแต่แบนด์วิดธ์ (bandwidth) สูงๆ ส่งข้อมูลทีละมากๆ เช่น ระบบที่มีแชนแนลที่ต่อถาวรและส่งข้อมูลจากจุดหนึ่งไปยังอีกจุดหนึ่งเท่านั้น (Dedicated channel)

โปรดใช้วิจารณญาณในการเลือก เพราะเป็นเพียงข้อแนะนำ ไม่ใช่ว่าจะถูกต้องเสมอไป ถ้าสนใจตามไปดูการวิเคราะห์ทั้งหมดได้เลย

ที่มา: http://tutorials.jenkov.com/java-nio/nio-vs-io.html

สแลช (Slash)

Advertisements