C# Socket.send 很慢
C# Socket.send is very slow
我正在使用 Socket
class 将字节数组中的图像数据发送到同一台 PC 上的第三方程序 运行(所以我不用担心关于连接问题)。由于我的应用程序非常简单,所以我只使用同步 send(bytes)
函数,仅此而已。问题是,它运行得很慢。如果我发送一张 20kB 的小图片,需要将近 15ms,但如果图片足够大 - 1.5mB,则需要将近 800ms,这对我来说是无法接受的。如何提高套接字性能?
Socket sender = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 3998);
sender.Connect(remoteEP);
byte[] imgBytes;
MemoryStream ms = new MemoryStream();
Image img = Image.FromFile("С:\img.bmp");
img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
imgBytes = ms.ToArray();
/*Some byte operations there: adding headers, file description and other stuff.
They are really fast and add just 10-30 bytes to array, so I don't post them*/
DateTime baseDate = DateTime.Now; // Countdown start
for (uint i = 0; i < 100; i++) sender.Send(byteMsg);
TimeSpan diff = DateTime.Now - baseDate;
Debug.Print("End: " + diff.TotalMilliseconds);
// 77561 for 1.42mB image, 20209 for 365kb, 1036 for 22kB.
这可能是将一个大文件读取到内存流,将其复制到一个数组,然后重新分配该数组以在其前面加上一些数据,这实际上会影响性能,而不是 Socket.send()。
尝试使用流到流的复制方法:
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 3998);
sender.Connect(remoteEP);
using (var networkStream = new NetworkStream(sender))
{
// Some byte operations there: adding headers, file description and other stuff.
// These should sent here by virtue of writing bytes (array) to the networkStream
// Then send your file
using (var fileStream = File.Open(@"С:\img.bmp", FileMode.Open))
{
// .NET 4.0+
fileStream.CopyTo(networkStream);
// older .NET versions
/*
byte[] buffer = new byte[4096];
int read;
while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0)
networkStream.Write(buffer, 0, read);
*/
}
}
问题出在另一边。我正在使用 Microsoft 的 CCV socket modification as a server and it seems, this programm makes lots of operations even while receiving a picture. I've tried my code from question with test server app (Synchronous Server Socket Example 并从中删除了字符串分析),因为这一切都开始快了近 100 倍。
我正在使用 Socket
class 将字节数组中的图像数据发送到同一台 PC 上的第三方程序 运行(所以我不用担心关于连接问题)。由于我的应用程序非常简单,所以我只使用同步 send(bytes)
函数,仅此而已。问题是,它运行得很慢。如果我发送一张 20kB 的小图片,需要将近 15ms,但如果图片足够大 - 1.5mB,则需要将近 800ms,这对我来说是无法接受的。如何提高套接字性能?
Socket sender = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 3998);
sender.Connect(remoteEP);
byte[] imgBytes;
MemoryStream ms = new MemoryStream();
Image img = Image.FromFile("С:\img.bmp");
img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
imgBytes = ms.ToArray();
/*Some byte operations there: adding headers, file description and other stuff.
They are really fast and add just 10-30 bytes to array, so I don't post them*/
DateTime baseDate = DateTime.Now; // Countdown start
for (uint i = 0; i < 100; i++) sender.Send(byteMsg);
TimeSpan diff = DateTime.Now - baseDate;
Debug.Print("End: " + diff.TotalMilliseconds);
// 77561 for 1.42mB image, 20209 for 365kb, 1036 for 22kB.
这可能是将一个大文件读取到内存流,将其复制到一个数组,然后重新分配该数组以在其前面加上一些数据,这实际上会影响性能,而不是 Socket.send()。
尝试使用流到流的复制方法:
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 3998);
sender.Connect(remoteEP);
using (var networkStream = new NetworkStream(sender))
{
// Some byte operations there: adding headers, file description and other stuff.
// These should sent here by virtue of writing bytes (array) to the networkStream
// Then send your file
using (var fileStream = File.Open(@"С:\img.bmp", FileMode.Open))
{
// .NET 4.0+
fileStream.CopyTo(networkStream);
// older .NET versions
/*
byte[] buffer = new byte[4096];
int read;
while ((read = fileStream.Read(buffer, 0, buffer.Length)) > 0)
networkStream.Write(buffer, 0, read);
*/
}
}
问题出在另一边。我正在使用 Microsoft 的 CCV socket modification as a server and it seems, this programm makes lots of operations even while receiving a picture. I've tried my code from question with test server app (Synchronous Server Socket Example 并从中删除了字符串分析),因为这一切都开始快了近 100 倍。