2011-05-10 3 views
0

Привет всем. Это место похоже на золотой рудник знаний, и это помогает мне так много! Мой следующий запрос:Обработка данных, отправленных и полученных сервером сокета в C#

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

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

+2

Покажите нам свой текущий метод, докажите, что он неэффективен, а затем вернитесь. Я могу почти гарантировать, что вы оптимизируете микро-оптимизацию, если считаете, что разделение строк неэффективно. –

ответ

1

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

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

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

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

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

0

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

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

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

Смежные вопросы