Когда я отправляю / получаю данные, используя HttpWebRequest (на Silverlight ) в небольших блоках, я измеряю очень маленькую пропускную способность 500 байтов / с в течение соединение "localhost". При отправке данных большими блоками у меня получается 2 МБ / с, что примерно в 5000 раз быстрее .
Кто-нибудь знает, что может вызвать эти невероятно большие накладные расходы?
Дополнительная информация :
- Я использую метод HTTP POST
- Я провел измерение производительности как в Firefox 3.6, так и в Internet Explorer 7. Оба показали одинаковые результаты.
- Мой ЦП загружен всего на 10% (четырехъядерный, так что на самом деле 40%)
- WebClient показал похожие результаты
- WCF / SOAP показали аналогичные результаты
Обновление : код на стороне клиента Silverlight, который я использую, по сути является моей собственной реализацией класса WebClient. Я написал это потому, что заметил ту же проблему с производительностью WebClient и подумал, что HttpWebRequest позволит настроить проблему с производительностью. К сожалению, это не сработало. Реализация выглядит следующим образом:
public class HttpCommChannel
{
public delegate void ResponseArrivedCallback(object requestContext, BinaryDataBuffer response);
public HttpCommChannel(ResponseArrivedCallback responseArrivedCallback)
{
this.responseArrivedCallback = responseArrivedCallback;
this.requestSentEvent = new ManualResetEvent(false);
this.responseArrivedEvent = new ManualResetEvent(true);
}
public void MakeRequest(object requestContext, string url, BinaryDataBuffer requestPacket)
{
responseArrivedEvent.WaitOne();
responseArrivedEvent.Reset();
this.requestMsg = requestPacket;
this.requestContext = requestContext;
this.webRequest = WebRequest.Create(url) as HttpWebRequest;
this.webRequest.AllowReadStreamBuffering = true;
this.webRequest.ContentType = "text/plain";
this.webRequest.Method = "POST";
this.webRequest.BeginGetRequestStream(new AsyncCallback(this.GetRequestStreamCallback), null);
this.requestSentEvent.WaitOne();
}
void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
System.IO.Stream postStream = webRequest.EndGetRequestStream(asynchronousResult);
postStream.Write(requestMsg.Data, 0, (int)requestMsg.Size);
postStream.Close();
requestSentEvent.Set();
webRequest.BeginGetResponse(new AsyncCallback(this.GetResponseCallback), null);
}
void GetResponseCallback(IAsyncResult asynchronousResult)
{
HttpWebResponse response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
Dim.Ensure(streamResponse.CanRead);
byte[] readData = new byte[streamResponse.Length];
Dim.Ensure(streamResponse.Read(readData, 0, (int)streamResponse.Length) == streamResponse.Length);
streamResponse.Close();
response.Close();
webRequest = null;
responseArrivedEvent.Set();
responseArrivedCallback(requestContext, new BinaryDataBuffer(readData));
}
HttpWebRequest webRequest;
ManualResetEvent requestSentEvent;
BinaryDataBuffer requestMsg;
object requestContext;
ManualResetEvent responseArrivedEvent;
ResponseArrivedCallback responseArrivedCallback;
}
Я использую этот код для отправки данных туда и обратно на HTTP-сервер.
Обновление : после обширных исследований я пришел к выводу, что проблема производительности присуща Silverlight v3 .