【发布时间】:2011-06-14 19:26:57
【问题描述】:
我正在尝试编写一个简单的 c# 应用程序,它可以从 FTP 服务器下载大量小文件。
我尝试了两种方法:
1 - 通用套接字编程
2 - 使用 FtpWebRequest 和 FtpWebResponse 对象
使用第一种方法时的下载速度(对于同一个文件)从 1.5 秒到 7 秒不等,第 2 种给出的结果相同,每次大约 2.5 秒。
考虑到这 2.5 秒中大约有 1.4 秒需要启动 FtpWebRequest 对象的过程(仅 1.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);
}
第二种方法的等效代码部分(特定文件总是需要大约 1.1 秒):
Int32 intResponseLength = ftpStream.Read(buffer, 0, intBufferSize);
while (intResponseLength != 0)
{
localFile.Write (buffer, 0, intResponseLength);
intResponseLength = ftpStream.Read(buffer, 0, intBufferSize);
}
我尝试过从 56b 到 32kB 的缓冲区 - 没有显着差异。
还在打开的数据套接字上创建一个流:
Stream str = new NetworkStream(dataSocket);
并读取它(而不是使用 dataSocket.Receive)
str.Read(buffer, 0, intBufferSize);
没有帮助...事实上它更慢。
提前感谢您的任何建议!
【问题讨论】: