2016-07-14 2 views
0

非常に遅いです(私は、接続の問題を心配する必要はありません)。私は本当に単純なアプリケーションを持っているので、私は同期のsend(bytes)関数だけを使用します。問題は、非常に遅いです。小さい20kBの画像を送信すると15ms近くかかりますが、画像が1.5mBほど大きければ、それは800ms近くかかりますが、これは私には受け入れられません。どのようにしてソケットのパフォーマンスを改善できますか?C#Socket.sendが、私は同じPC上で実行されているサードパーティ製のプログラムの開発にバイト配列内の画像データを送信するために<code>Socket</code>クラスを使用してい

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. 
+0

イメージの送信方法を表示できますか? – mxmissile

+0

マイ・ポストを更新しました。 – JustLogin

+0

正しいことをベンチマークしていますか?すなわち、 'sender.Send'だけですか? – Martijn

答えて

1

問題は、他の側にいました。私はサーバとしてCCV socket modificationを使用しています、そして、このプログラムは画像を受け取っている間でさえたくさんの操作をします。私はテストサーバーアプリケーション(Synchronous Server Socket Exampleマイクロソフトから質問から私のコードを試して、それから文字列解析を削除しました)、これは100倍近い速度で作業を開始して以来。

1

これは)(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); 
       */ 
      } 
     } 
+0

ありがとうございますが、パフォーマンスを殺すのは間違いなく 'Socket.send()'です。私はこれを明白にするために投稿を更新しました。 – JustLogin

関連する問題