【问题标题】:FTP download speed issue: .NET socket programming vs using FtpWebRequest/Response objectsFTP 下载速度问题:.NET 套接字编程与使用 FtpWebRequest/Response 对象
【发布时间】: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);

没有帮助...事实上它更慢。

提前感谢您的任何建议!

【问题讨论】:

    标签: c# sockets ftp


    【解决方案1】:

    您需要使用 Socket.Poll 或 Socket.Select 方法来检查数据的可用性。您所做的不仅会减慢操作速度,还会导致大量 CPU 负载。轮询或选择将产生处理器时间,直到数据可用或超时结束。您可以保持相同的循环,但包括对上述方法之一的调用,并使用超时(尝试从 10 毫秒到 500 毫秒的值来查找超时,这对于您的任务是最佳的)。

    【讨论】:

    • 使用显式的Thread.Sleep 可以或多或少地消除过多的 CPU 负载,以使繁忙循环远不那么繁忙……至少在最低睡眠频率开启时平台(
    • @pst 睡眠会减慢传输速度 - 如果缓冲区中有数据等待处理,睡眠的原因是什么?
    • 尤金,感谢您的回答。但是它对我不起作用;-(我修改了我的代码如下(可能有点过度......?):
    • 代码:if (dataSocket.Poll(500000, SelectMode.SelectRead)) //0.5s { Int32 intResponseLength = dataSocket.Receive(buffer, intBufferSize, SocketFlags.None); while (intResponseLength != 0) { localFile.Write(buffer, 0, intResponseLength); if (dataSocket.Poll(500000, SelectMode.SelectRead)) { intResponseLength = dataSocket.Receive(buffer, intBufferSize, SocketFlags.None); } } }
    • 下载给定文件所需的时间保持不变。我做错了吗?你还有什么可以建议的吗?我应该使用异步方法吗?干杯!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    相关资源
    最近更新 更多