提升asio socket:从硬盘读取文件的最快方法?

时间:2011-08-21 19:41:28

标签: c++ file sockets boost boost-asio

所以我尝试过:

int buff_length = 8192;
ifstream stream;
char* buffer = new char[buff_length];

stream.open( path.string().c_str(), ios::binary );

boost::system::error_code ignored_error;

while (stream)
{
    stream.read(buffer, buff_length);
    boost::asio::write(*socket, boost::asio::buffer(buffer, stream.gcount()),
                            boost::asio::transfer_all(), ignored_error);  
}

我想知道你是怎么做到的 - 怎么做得更快?

我的应用程序可以在Windows,Linux和mac os上运行。这就是我使用boost的原因。我使用ab进行测试。我希望在阅读和发送文件时获得2或至少1.5倍的速度。可能是Boost :: Iostream可以帮助我任何方法吗?

3 个答案:

答案 0 :(得分:1)

不完全确定您的目标,但要回答有关快速阅读文件的问题,您可以将文件映射到内存

这样您就可以从内存而不是磁盘中读取内存。取决于文件大小等,可能有不同的方法,例如,将整个文件映射为小文件或在整个文件中映射文件区域(如果它是一个大文件)。

在Boost.Interprocess中,您可以阅读有关此here的更多信息。

答案 1 :(得分:0)

如果您要优化的是通过套接字从磁盘发送文件,请查看sendfile(2)如果您使用的是Linux。它专门为此目的而设计。

如果你想坚持使用更像现在的东西,但要调整它,我会尝试将缓冲区设为少量兆字节,而不是仅仅8 KB。

答案 2 :(得分:0)

boost :: asio已经包装了TransmitFile,请参阅以下example