.NET中缓慢的套接字性能 - 任何提示?

时间:2015-05-18 14:37:27

标签: .net vb.net performance sockets tcp

我在.NET中使用TCP套接字时遇到了一些性能问题。我的应用程序仅在本地网络中发送文件。 如果我在localhost上运行我的代码,性能很好(全速 - 在SSD上大约250 Mbyte / sec)。 但是,当我尝试在不同设备之间的本地千兆网络中发送大量数据时,速度仅为2-4 Mbyte / sec。

我尝试优化缓冲区大小(同时在两侧设置Receive-和Sendbuffersize),但这没有多大帮助。以下是代码的重要部分:

接收:

'f contains the file path
'client = listener.AcceptTCPClient...
client.ReceiveBufferSize = RECSENDBUFFSIZE
client.SendBufferSize = RECSENDBUFFSIZE
Dim stream As IO.Stream = client.GetStream()

Dim buffer(BLOCKSIZE - 1) As Byte
Dim fstream As New IO.FileStream(f, FileMode.Open)
Dim flen As ULong = fstream.Length
While fstream.Position < fstream.Length
    Dim count As Integer = fstream.Read(buffer, 0, BLOCKSIZE)
    stream.Write(buffer, 0, count)
End While
fstream.Close()

发送:

'f contains the file path
client.Connect(_address, PORT)
stream = client.GetStream
client.ReceiveBufferSize = RECSENDBUFFSIZE
client.SendBufferSize = RECSENDBUFFSIZE

Dim target As String = IO.Path.Combine(MAINFOLDER, f)
Dim fstream As New IO.FileStream(target, FileMode.Create)
Dim buffer(BLOCKSIZE - 1) As Byte
Dim flen As ULong = filesizes(i)
Do
    'I use the min function because there are many files that are transmitted in one connection
    Dim count As Integer = stream.Read(buffer, 0, Math.Min(flen, BLOCKSIZE))
    If count = 0 Then 'some error handling...
    fstream.Write(buffer, 0, count)
    flen -= count
    If flen = 0 Then Exit Do
Loop
fstream.Close()

令人惊讶的是,通过与不同客户端的并行连接,绝对数据吞吐量增加。 我已经在考虑多个TCP流的实现,但担心同步的成本太高而不会产生影响。

你有任何表现提示吗?谢谢。

1 个答案:

答案 0 :(得分:0)

你正在比较错误的事情。您不应该将localhost的速度与真实网络访问的速度进行比较。当您使用TCP进行localhost时,实际使用的唯一层是TCP和IP。 IP检测到所有内容都是本地的,并立即返回TCP,没有任何流量控制。当涉及实际的网络层时,必然会在其他网络层或驱动程序中进行流量控制。

你应该真正比较你的速度是你本地网络的速度。这有点棘手,但这可能会有所帮助: http://www.makeuseof.com/tag/test-home-network-speed-decipher-results/

网络速度通常以Mbps为单位表示,即每秒兆比特。 在上面的站点上有一个对话框,用于产生17 Mbps的本地网络,您有2-4 * 8 = 16-32 Mbps,而不考虑TCP的开销。

但是您应该对本地网络性能进行测试并与之进行比较而不是使用localhost。