首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HttpListener性能优化

HttpListener性能优化
EN

Stack Overflow用户
提问于 2011-08-02 13:58:54
回答 1查看 4.4K关注 0票数 1

我使用HttpListener作为简单的http服务器。我一直在对请求/秒性能进行基准测试,让HttpListener为每个请求返回字符串"OK“-这达到了每秒16,000个请求的限制。基于下面的代码,我能做些什么来进一步优化性能呢?还是说,我们正在触及Windows Http.sys的极限?

图像上传不起作用,这里有一个指向Visual Studio性能跟踪的链接:

VS Performance Trace

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-02 14:04:59

你可以做的一件事就是只调用Encoding.UTF8.GetBytes("OK")一次,而不是每次请求都调用。我怀疑这会有多大的不同,但如果您对每个请求都执行完全相同的操作,那么您还不如以所需的形式获得响应。

我也会使用Using语句,而不是显式地调用Close和Dispose。这不是性能上的问题--只是当出现异常时避免未关闭的流出现问题的一般良好实践。

实事求是地说,你需要达到16K以上的QPS吗?你有没有弄清楚你是受CPU限制还是受IO限制?一旦你的程序需要对每个请求做一些实际的工作,我想这将使你在这里所做的任何微优化都相形见绌。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6907841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档