Обработка данных, отправленных и полученных сервером сокетов в c # - PullRequest
0 голосов
/ 10 мая 2011

Привет всем.Это место как золотая жила знаний, и оно мне очень помогает!Мой следующий запрос:

Я отправил байтовые данные на мой сервер сокетов c #.Я преобразовываю его в строку ascii, затем разделяю данные на основе общего символа (например, символа |) и использую данные.Обычно первый фрагмент данных представляет собой команду в виде 4-значного числа.Я могу представить, что это не очень эффективно!Каков наилучший способ обработки данных при получении, эффективно?

Связано, как мне перехватывать и обрабатывать команды?Несколько операторов if или большой оператор case / switch.Мне действительно нужна скорость и эффективность.

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Обычно первый фрагмент данных представляет собой команду в виде 4-значного числа.Я могу представить, что это не очень эффективно!Каким наилучшим способом обработки данных является получение, эффективно?

Нет, преобразование числа в / из строки неэффективно.Но вопрос в том, действительно ли это имеет значение?Мне кажется, что вы пытаетесь сделать преждевременную оптимизацию.Не делай этого.Ваша цель должна состоять в том, чтобы написать код, который легко читать и поддерживать.Не выполняйте оптимизацию, пока кто-то не начнет жаловаться на производительность.

Связано, как мне отлавливать и обрабатывать команды?Несколько операторов if или большой оператор case / switch.Мне действительно нужны скорость и эффективность.

Снова.Определите, что обработка команд действительно является узким местом в вашем приложении.

Вся обработка действительно зависит от того, что вы делаете с входящими сообщениями.Вы предоставляете мало информации, чтобы дать правильный ответ.Создайте новый вопрос (поскольку два вопроса в одном не разрешены).Добавьте код, который показывает вашу текущую обработку и опишите, что вам не нравится в этом.

0 голосов
/ 10 мая 2011

Если вам действительно нужна производительность, я думаю, вам не следует использовать строковое представление для вашей команды, а работать непосредственно с байтами. Четыре числа в строковом формате имеют размер 32 или 64 бита (в зависимости от того, какую кодировку вы используете), при этом одного байта достаточно для хранения четырехзначного числа. Использование большого количества веток (которые if -выражения) также влияет на вашу производительность.

Мое предложение - зарезервировать префикс фиксированного размера в своем сообщении для команды. Затем вы используете эти байты для поиска в O (1) таблицы, какую команду вы должны выполнить, эта таблица может быть заполнена объектом, имеющим метод execute. Таким образом, вы можете сделать что-то table[command].execute().

При этом, я не думаю, что выигрыш в производительности был бы таким большим, и что вам лучше (в обслуживании) использовать одну из библиотек сериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...