Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net NET中套接字性能缓慢-有什么提示吗?_.net_Vb.net_Performance_Sockets_Tcp - Fatal编程技术网

.net NET中套接字性能缓慢-有什么提示吗?

.net NET中套接字性能缓慢-有什么提示吗?,.net,vb.net,performance,sockets,tcp,.net,Vb.net,Performance,Sockets,Tcp,我在.NET中使用TCP套接字时遇到一些性能问题。我的应用程序只在本地网络中发送文件。 如果我在本地主机上运行我的代码,那么性能将达到极高的全速—在SSD上大约为250 MB/秒。 但是,当我试图在不同设备之间的本地千兆网络中发送大数据时,速度仅为2-4兆字节/秒左右 我试图优化缓冲区大小,并在两侧设置接收和发送缓冲区大小,但这没有多大帮助。以下是代码的重要部分: 接收: 'f contains the file path 'client = listener.AcceptTCPClient..

我在.NET中使用TCP套接字时遇到一些性能问题。我的应用程序只在本地网络中发送文件。 如果我在本地主机上运行我的代码,那么性能将达到极高的全速—在SSD上大约为250 MB/秒。 但是,当我试图在不同设备之间的本地千兆网络中发送大数据时,速度仅为2-4兆字节/秒左右

我试图优化缓冲区大小,并在两侧设置接收和发送缓冲区大小,但这没有多大帮助。以下是代码的重要部分:

接收:

'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()
令人惊讶的是,通过与不同客户机的并行连接,绝对数据吞吐量增加了。 我已经在考虑多个TCP流的实现,但担心同步的成本太高,不会有什么不同


你有什么表演技巧吗?谢谢。

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

您真正应该比较的是本地网络的速度。这有点棘手,但这可能会有所帮助:

网络的速度通常以Mbps表示,即兆位每秒。 在上面的站点上,有一个本地网络的对话框,可以产生17 Mbps的速率,在不考虑TCP开销的情况下,可以获得2-4*8=16-32 Mbps的速率


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

BLOCKSIZE的值是多少?感谢您的回复。出于测试目的,我选择了介于1024和131072之间的值。在两台主机之间复制一个大文件以确认获得了预期的吞吐量。如果速度慢,则是网络中的某些东西从每个系统上的网络驱动程序开始,不一定在代码中,您的代码也可能有问题,但如果存在网络问题,您需要修复该问题以查看代码的执行情况。您确实意识到,比较本地主机和本地网络毫无意义。对于localhost,没有任何连接,网络驱动程序甚至没有地址。谢谢。我尝试了localhost,因为我不确定CPU负载是否是限制因素。当然不是,但我正在拼命寻找解决办法。谢谢你的回答。在接下来的几天里,我将尝试使用本文中介绍的工具运行一些测试。也许是我错了。
'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()