我使用HttpListener作为简单的http服务器。我一直在对请求/秒性能进行基准测试,让HttpListener为每个请求返回字符串"OK“-这达到了每秒16,000个请求的限制。基于下面的代码,我能做些什么来进一步优化性能呢?还是说,我们正在触及Windows Http.sys的极限?
图像上传不起作用,这里有一个指向Visual Studio性能跟踪的链接:
VS Performance Trace
Public Class HTTPServer
Shared Listener As HttpListener = New HttpListener
Public Shared Sub Start()
ServicePointManager.DefaultConnectionLimit = 500
ServicePointManager.Expect100Continue = False
ServicePointManager.MaxServicePoints = 500
Listener.Prefixes.Add("http://localhost/")
Listener.Start()
For i As Integer = 1 To (System.Environment.ProcessorCount * 2)
Dim NewThread As New System.Threading.Thread(AddressOf ListenerThread)
NewThread.Priority = ThreadPriority.Normal
NewThread.IsBackground = True
NewThread.Start()
Next
End Sub
Private Shared Sub ListenerThread()
Dim SyncResult As IAsyncResult
While True
SyncResult = Listener.BeginGetContext(New AsyncCallback(AddressOf ListenerCallback), Listener)
SyncResult.AsyncWaitHandle.WaitOne()
End While
End Sub
Private Shared Sub ListenerCallback(ByVal StateObject As IAsyncResult)
Dim Listener As HttpListener = DirectCast(StateObject.AsyncState, HttpListener)
Dim Context As HttpListenerContext = Listener.EndGetContext(StateObject)
Dim Request As HttpListenerRequest = Context.Request
Dim Response As HttpListenerResponse = Context.Response
Dim ResponseString As String = "OK"
Dim Buffer As Byte() = System.Text.Encoding.UTF8.GetBytes(ResponseString)
Response.ContentLength64 = Buffer.Length
Dim OutputStream As System.IO.Stream = Response.OutputStream
OutputStream.Write(Buffer, 0, Buffer.Length)
OutputStream.Close()
OutputStream.Dispose()
End Sub
End Class发布于 2011-08-02 14:04:59
你可以做的一件事就是只调用Encoding.UTF8.GetBytes("OK")一次,而不是每次请求都调用。我怀疑这会有多大的不同,但如果您对每个请求都执行完全相同的操作,那么您还不如以所需的形式获得响应。
我也会使用Using语句,而不是显式地调用Close和Dispose。这不是性能上的问题--只是当出现异常时避免未关闭的流出现问题的一般良好实践。
实事求是地说,你需要达到16K以上的QPS吗?你有没有弄清楚你是受CPU限制还是受IO限制?一旦你的程序需要对每个请求做一些实际的工作,我想这将使你在这里所做的任何微优化都相形见绌。
https://stackoverflow.com/questions/6907841
复制相似问题