Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ทำไมควรหลีกเลี่ยง std::endl ใน C++: เหตุผลด้านประสิทธิภาพ

หลายโปรแกรมเมอร์ใช้ std::endl เพื่อขึ้นบรรทัดใหม่ แต่ไม่รู้ว่ามันส่งผลต่อประสิทธิภาพอย่างรุนแรงเมื่อใช้กับปริมาณ I/O มาก

ความแตกต่างระหว่าง std::endl และ '\n'

คุณสมบัติstd::endl'\n'
ขึ้นบรรทัดใหม่✓✓
Flush buffer✓ (ทุกครั้ง)✗ (ไม่บังคับ)
ค่าใช้จ่ายสูง (system call)ต่ำ

ทำไม Flush Buffer ถึงมีค่าใช้จ่ายสูง?

  • การ flush buffer ต้องเรียก system call ไปยัง kernel ของ OS
  • OS จัดการ buffer เองได้ดี (flush เมื่อเต็ม หรือเมื่อโปรแกรมจบ)
  • การ flush บังคับบ่อยครั้งทำให้ I/O ช้าลงมาก

การทดสอบประสิทธิภาพ

การเขียน 100,000 บรรทัดลงไฟล์:

  • ใช้ std::endl: ใช้เวลาประมาณ 2 เท่า ของ '\n'
  • ใช้ '\n': รวดเร็วกว่ามาก เพราะไม่ flush ทุกบรรทัด

แนวทางปฏิบัติที่ดีที่สุด

// ✅ แนะนำ: ใช้ '\n' สำหรับการเขียนทั่วไป
for (int i = 0; i < 100000; ++i) {
    cout << "Line " << i << '\n';
}

// ✅ ใช้ endl เฉพาะเมื่อต้องการ flush จริง (เช่น logging สำคัญ)
cout << "Critical error!" << endl;

// ✅ หรือ flush แบบชัดเจนเมื่อจำเป็น
cout << "Progress: " << percent << "%" << flush;

สรุป

ใช้ '\n' สำหรับการขึ้นบรรทัดใหม่ทั่วไป จะทำให้โปรแกรมรวดเร็วขึ้นอย่างมีนัยสำคัญ โดยเฉพาะโปรแกรมที่ทำ I/O มาก ใช้ std::endl หรือ std::flush เฉพาะเมื่อจำเป็นต้องมั่นใจว่าข้อมูลถูกเขียนออกทันที