Tôi đang sử dụng lệnh gọi hàm fwrite()
để ghi dữ liệu vào một đường ống trên Linux.Hiểu hành vi đệm của fwrite()
Trước đó, fwrite()
đã được gọi cho khối dữ liệu nhỏ (trung bình 20 byte) nhiều lần và bộ đệm được để lại fwrite()
. strace trên quá trình cho thấy rằng 4096 byte dữ liệu đã được viết tại một thời điểm.
Hóa ra quy trình viết này là nút cổ chai trong chương trình của tôi. Vì vậy, tôi quyết định để đệm dữ liệu trong mã của tôi vào khối 64KB và sau đó viết toàn bộ khối tại một thời điểm sử dụng fwrite()
. Tôi đã sử dụng setvbuf()
để đặt con trỏ FILE * thành 'No Buffering'.
Cải thiện hiệu suất không đáng kể như tôi mong đợi.
Quan trọng hơn, đầu ra strace
cho thấy dữ liệu vẫn đang được viết 4096 byte tại một thời điểm. Ai đó có thể giải thích hành vi này cho tôi không? Nếu tôi đang gọi fwrite()
với 64KB dữ liệu, tại sao nó chỉ viết 4096 byte tại một thời điểm?
Có cách nào thay thế cho fwrite()
để ghi dữ liệu vào đường ống bằng cách sử dụng con trỏ FILE * không?
Bạn có thể hiển thị mã cho chúng tôi không? – tuxuday
@Shailesh_Tainwala: Bạn có thể viết mã của bạn bằng C++, nhưng đây là câu hỏi c chứ không phải là C++. 'fwrite()' là một hàm c, không phải là hàm C++. Tôi đã thêm thẻ c vào câu hỏi của bạn để bạn có thể có được đối tượng rộng hơn. –