SỰ KHÁC NHAU GIỮA std::endl VÀ “\n” TRONG C++

Nếu là một developer C++, chắc hẳn bạn đã từng có lần thắc mắc std::endl và “\n” có gì khác nhau? Và sự khác nhau này có ảnh hưởng đến chương trình của bạn như thế nào? Bài viết này chúng ta sẽ cùng nhau “mổ sẻ” sự khác nhau, ảnh hưởng của chúng, và với sự khác nhau này thì khi nào chúng ta nên dùng std::endl và khi nào nên dùng “\n”.

Về cơ bản, std::endl và “\n” đều in ra dòng xuống hàng, nhưng std::endl sẽ flush buffer tức là nó sẽ in ngay ra tức thì còn “\n” sẽ được lưu tại buffer và nó sẽ không bị flush. Thông thường thì chúng ta không cần để ý tới vấn đề này, nhưng có một số trường hợp chúng ta nên sử dụng đúng loại để đạt được kết quả mong muốn.

Trường hợp 1 : performance

Với sự khác nhau như trên thì chắc chắn là std::endl sẽ chậm hơn “\n” bởi vì nó phải flush buffer liên tục. Chúng ta hãy cùng làm một bài test nhỏ với đoạn code sau:

Chạy chương trình trên lần lượt với std::endl và “\n”, kết quả tương ứng sẽ là khoảng 22s và 2s! Có thể thấy “\n” nhanh hơn rất nhiều so với std::endl. Vậy nếu quan tâm tới performance, tốc độ của chương trình, nên sử dụng “\n” thay cho std::endl.

Trường hợp 2: debugging

Nếu std::endl chậm như vậy, tại sao chúng ta lại cần có nó? Có phải nó vô dụng không? Cùng xem xét đoạn code dưới đây.

Chúng ta dùng lại đoạn code trên, nhưng khi đang trong vòng loop 10000000 lần, ta thử làm cho chương trình bị crash để xem kết quả như thế nào

Khi chạy chương trình trên, với code dùng std::endl, file log.log sẽ in ra ngay kết quả lúc chương trình bị crash, tại vì nó flush buffer ngay tức thì. Tuy nhiên, với “\n” file log.log có thể in ra kết quả không đầy đủ, hoặc như với trường hợp này là file log.log hoàn toàn không có dữ liệu gì. Hãy tưởng tượng, bạn có một chương trình, đang chạy giữa chừng thì bị crash, bạn đặt log tại đó để debug, nhưng lại sử dụng “\n”, lúc này kết quả trong file log không còn chính xác như những gì chương trình thực thi ngay tại thời điểm bị crash, dẫn tới bạn debug sai, và cũng có thể mất cả một ngày để debug tại chỗ không phải là bug :(. Vì vậy, khi muốn debug một chương trình bị crash giữa chừng, multithread hay muốn kết quả ghi ra log file là chính xác nhất ngay tại thời điểm đó, hãy sử dụng std::endl thay cho “\n”.

Summary

Bạn thấy đó, đôi khi chỉ cần một thay đổi nhỏ cũng mang lại những ảnh hưởng rất lớn. std::endl và “\n” là một ví dụ điển hình của việc thay đổi nhỏ, ảnh hưởng lớn.

  • Khi quan tâm tới performance, muốn chương trình chạy nhanh . Sử dụng “\n” thay cho std::endl;
  • Khi debug chương trình bị crash, multithread. Sử dụng std::endl thay cho “\n”.

 

Bài viết liên quan