Оптимизация производительности HttpListener - PullRequest
1 голос
/ 02 августа 2011

Я использую HttpListener как простой http-сервер. Я тестировал производительность по требованию / сек, когда HttpListener возвращал строку «ОК» для каждого запроса - это достигло предела в 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

1 Ответ

1 голос
/ 02 августа 2011

Ну одна вещь, которую вы можете сделать, это позвонить Encoding.UTF8.GetBytes("OK") только один раз, а не на каждый запрос. Я сомневаюсь, что это будет иметь большое значение, но если вы делаете одно и то же по каждому запросу, вы также можете получить этот ответ в той форме, в которой он вам нужен.

Я бы также использовал оператор Using вместо того, чтобы явно вызывать Close и Dispose. Это не производительность, а просто хорошая практика - избегать проблем с незамкнутыми потоками, когда есть исключения.

Реально, вам нужно , чтобы набрать более 16K QPS? Работали ли вы с процессором или с IO? Как только ваша программа действительно будет выполнять какую-то реальную работу над каждым запросом, я бы предположил, что она затмит любые микрооптимизации, которые вы здесь делаете.

...