我在.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流的实现,但担心同步的成本太高而不会产生影响。
你有任何表现提示吗?谢谢。
答案 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。