Boost asio socket: самый быстрый способ чтения файла с жесткого диска? - PullRequest
5 голосов
/ 21 августа 2011

Итак, я попробовал:

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 ]

1 голос
/ 22 августа 2011

Не совсем уверен, что вы ищете, но чтобы ответить на ваш вопрос о быстром чтении файлов, вы можете отобразить файл в память .

Таким образом, вы читаете из памяти, а не с диска. В зависимости от размера файла и тому подобного, могут быть интересные подходы, например, отображать весь файл, если он небольшой, или отображать области файла по всему файлу во время его обработки, если это большой файл.

В Boost.Interprocess вы можете узнать больше об этом здесь .

0 голосов
/ 22 августа 2011

boost :: asio уже упаковал TransmitFile, см. Следующий пример

0 голосов
/ 21 августа 2011

Если вы пытаетесь оптимизировать отправку файла с диска через сокет, проверьте sendfile (2) , если вы работаете в Linux. Он специально разработан для этой цели.

Если вы хотите придерживаться чего-то более похожего на то, что у вас есть сейчас, но настройте его, я бы попытался сделать буфер небольшим количеством мегабайт, а не просто 8 КБ.

...