您也应该对其进行分析,看看瓶颈在哪里。
也许它在内核中,也许是你的硬件限制。直到您对其进行分析以发现您在黑暗中跌跌撞撞。
编辑:
好的,那么这次来个更彻底的答案。根据 Boost.Iostreams 文档,basic_file_source 只是std::filebuf 的一个包装器,而它又是基于std::streambuf 构建的。引用文档:
以只读模式打开的 std::basic_filebuf 的 CopyConstructible 和 Assignable 包装器。
streambuf 确实提供了一个方法 pubsetbuf(也许不是最好的参考,但第一个 google 出现了),显然您可以使用它来控制缓冲区大小。
例如:
#include <fstream>
int main()
{
char buf[4096];
std::ifstream f;
f.rdbuf()->pubsetbuf(buf, 4096);
f.open("/tmp/large_file", std::ios::binary);
while( !f.eof() )
{
char rbuf[1024];
f.read(rbuf, 1024);
}
return 0;
}
在我的测试中(尽管优化关闭)我实际上使用 4096 字节缓冲区的性能比使用 16 字节缓冲区的性能更差,但是 YMMV - 一个很好的例子,说明为什么你应该总是首先分析 :)
但是,正如您所说,basic_file_sink 不提供任何访问方法,因为它在其private part 中隐藏了底层的filebuf。
如果您认为这是错误的,您可以:
- 敦促 Boost 开发人员公开此类功能,使用邮件列表或 trac。
- 构建您自己的
filebuf 包装器,它会公开缓冲区大小。教程中有一个section,它解释了编写自定义源代码,这可能是一个很好的起点。
- 根据任何内容编写自定义源,以完成您喜欢的所有缓存。
请记住,您的硬盘驱动器和内核已经对文件读取进行缓存和缓冲,我认为您不会从缓存中获得更多的性能提升。
最后,谈谈剖析。有很多强大的分析工具可用于 Linux,我什至不知道其中一半的名称,但例如有 iotop,它有点简洁,因为它使用起来超级简单。它与 top 非常相似,但显示的是与磁盘相关的指标。例如:
Total DISK READ: 31.23 M/s | Total DISK WRITE: 109.36 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
19502 be/4 staffan 31.23 M/s 0.00 B/s 0.00 % 91.93 % ./apa
告诉我,我的程序 90% 以上的时间都在等待 IO,即它是 IO 绑定的。如果您需要更强大的功能,我相信 google 可以帮助您。
请记住,对热缓存或冷缓存进行基准测试会极大地影响结果。