Я пытаюсь написать простое приложение на c #, которое загружает большое количество маленьких файлов с FTP-сервера.
Я пробовал два подхода:
1 - общее программирование сокетов
2 - использование объектов FtpWebRequest и FtpWebResponse
Скорость загрузки (для одного и того же файла) при использовании первого подхода варьируется от 1,5 с до 7 с, второй дает более менее одинаковые результаты - около 2,5 с каждый раз.
Учитывая, что примерно 1,4 с из этих 2,5 с занимают процесс инициализации объекта FtpWebRequest (только 1,1 с для получения данных), разница весьма значительна.
Вопрос в том, как добиться для 1-го подхода такой же стабильной скорости загрузки, что и для 2-го?
Для 1-го подхода проблема, похоже, заключается в следующем цикле (поскольку это занимает около 90% времени загрузки):
Int32 intResponseLength = dataSocket.Receive(buffer, intBufferSize, SocketFlags.None);
while (intResponseLength != 0)
{
localFile.Write(buffer, 0, intResponseLength);
intResponseLength = dataSocket.Receive(buffer, intBufferSize, SocketFlags.None);
}
Эквивалентная часть кода для 2-го подхода (всегда занимает около 1,1 с для конкретного файла):
Int32 intResponseLength = ftpStream.Read(buffer, 0, intBufferSize);
while (intResponseLength != 0)
{
localFile.Write (buffer, 0, intResponseLength);
intResponseLength = ftpStream.Read(buffer, 0, intBufferSize);
}
Я пробовал буферы от 56 до 32 КБ - без существенной разницы.
Также создание потока в открытом сокете данных:
Stream str = new NetworkStream(dataSocket);
и чтение его (вместо использования dataSocket.Receive)
str.Read(buffer, 0, intBufferSize);
не помогает ... на самом деле это даже медленнее.
Заранее спасибо за любые предложения!