2011-08-21 65 views
5

所以我曾尝试:Boost asio socket:从硬盘读取文件的最快方法?

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上运行。这就是为什么我使用提升很多。我使用ab进行测试。我想在阅读和发送文件时得到2或至少1.5倍的速度。可能是Boost :: Iostream可以帮助我怎么做?

+0

您一次发送多少个文件(一个接一个地发送)?你的文件通常有多大? –

回答

0

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

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

+1

等效于'sendfile'的Windows是['TransmitFile'](http://msdn.microsoft.com/zh-cn/library/ms740565%28v=VS.85%29.aspx) – Hasturkun

+0

MacOSX上的sendfile是否可用? – Rella

+0

@Kabumbus:是的,sendfile可在OS X上找到:http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man2/sendfile.2.html –

0

的boost :: ASIO已经包裹的TransmitFile,请参阅以下example

+1

请注意,此示例是Windows特定的 –

1

不能完全确定你以后,但可以回答有关文件,您可以文件映射到内存的快速阅读的问题。

这样你从内存中读取而不是从磁盘读取。根据文件的大小,有不同的方法可能会引起兴趣,例如,在文件整个文件的小区域或映射区域中映射整个文件,如果它是一个大文件的话。

在Boost.Interprocess中,您可以阅读更多关于此here