Ну одна вещь, которую вы можете сделать, это позвонить Encoding.UTF8.GetBytes("OK")
только один раз, а не на каждый запрос. Я сомневаюсь, что это будет иметь большое значение, но если вы делаете одно и то же по каждому запросу, вы также можете получить этот ответ в той форме, в которой он вам нужен.
Я бы также использовал оператор Using
вместо того, чтобы явно вызывать Close и Dispose. Это не производительность, а просто хорошая практика - избегать проблем с незамкнутыми потоками, когда есть исключения.
Реально, вам нужно , чтобы набрать более 16K QPS? Работали ли вы с процессором или с IO? Как только ваша программа действительно будет выполнять какую-то реальную работу над каждым запросом, я бы предположил, что она затмит любые микрооптимизации, которые вы здесь делаете.