Abh*_*hek 5 c c++ linux io buffering
我正在使用C++ Std库方法std :: ostream :: write()观察以下行为.
为了缓冲数据,我正在使用以下C++ API
std::ofstream::rdbuf()->pubsetbuf(char* s, streamsize n)
Run Code Online (Sandbox Code Playgroud)
只要我们在文件流上写入数据(datasize)的大小,这样就可以正常工作(使用strace实用程序验证)
std::ofstream::write (const char* s, datasize n)
Run Code Online (Sandbox Code Playgroud)
小于1023字节(低于此值,写入累积直到缓冲区未满),但是当要写入的数据大小超过1023时,不考虑缓冲区并将数据刷新到文件中.
例如,如果我将缓冲区大小设置为10KB并且每次写入大约512字节,则strace将显示多个写入已合并为单个写入
writev(3, [{"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"..., 9728}, {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"..., 512}], 2) = 10240 ( 10 KB )
writev(3, [{"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"..., 9728}, {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"..., 512}], 2) = 10240
...
Run Code Online (Sandbox Code Playgroud)
但是当我一次写入1024个字节(保持缓冲区固定为10 KB)时,现在strace告诉我它没有使用缓冲区,并且每个ofstream :: write调用都被转换为写入系统调用.
writev(3, [{NULL, 0}, {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"..., 1024}], 2) = 1024 ( 1KB )
writev(3, [{NULL, 0}, {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"..., 1024}], 2) = 1024
...
Run Code Online (Sandbox Code Playgroud)
是否有我缺少的C++ API调用或Linux调优参数?
这是libstdc++的实现细节,在bits/fstream.tcc的第650行左右实现。基本上,如果写入大于 2^10,它将跳过缓冲区。
如果您想了解此决定背后的理由,我建议您向 libstdc++ 开发列表发送邮件。
http://gcc.gnu.org/ml/libstdc++/
| 归档时间: |
|
| 查看次数: |
3929 次 |
| 最近记录: |