![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
C4Grey |
|
||||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 23.5.2007 Репутация: нет Всего: 1 |
Приветствую
Есть самописный мультипоточный сервер на сокетх. Каждый сокет обернут в обработчик(наследник Thread), который читает сообщения, обрабатывает исключения + еще пару функций. Сообщения - сериализируемые классы, все имеют целочисельное поле DataType(наследуется от базового класса собщений). К обработчику прикреплен класс MessageProcessor, который описывает логику обработки сообщения(отправить список игроков, добавить пользователя в комнату, переслать сообщение всем игрокам, и т.п.). Выбор метода обработки происходит по switch (AMessage.DataType) - в зависимости от соответствия DataType определенной константе выполняем некую функцию класса MessageProcessor. С Java работаю не очень давно, недавно узнал что в ней есть возможность создания методов-делегатов. Стало интересно, какой метод будет быстрее работать: switch в цикле чтения, или альтернатива - в конструкторе MessageProcessor(и наследников) формировать массив делегатов и дергать их по константе. Как-то так:
и при чтении вызываем нужный метод:
Примеры упрощенные, без проверок на существование метода(в случае, если пришел неизвестный ID) и т.п. Вроде храним мы только ссылки на методы, по идее должно работать резвее, но так как Java я почти не знаю - прошу совета. Это сообщение отредактировал(а) C4Grey - 31.3.2012, 00:35 |
||||
|
|||||
kosmonaFFFt |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 538 Регистрация: 14.4.2008 Где: Иннополис Репутация: нет Всего: 5 |
Насколько я знаю, reflection довольно медленный, лучше было бы сделать один интерфейс для обработчиков, и каждый обработчик сделать как его реализацию, а в коллекции уже хранить ссылки на объекты обработчиков...
-------------------- ![]() |
|||
|
||||
C4Grey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 23.5.2007 Репутация: нет Всего: 1 |
Спасибо за ответ
Касательно распределения обработчиков по классам - думал об этом, даже частично реализовал, но большинство методов - строчек 10 кода, заводить ради них по классу...ну, как-то странно ![]() P.S. Пока что самой полезной для меня оказалась эта статья: http://habrahabr.ru/post/69552/ . Если исходить из представленных в ней статистических данных(хотя и не совсме корректно, на мой взгляд, собранных) то invoke осуществляется приблизительно в 100 раз медленнее прямого вызова. Думаю что полный ответ на свой вопрос получу только после собственного тестирования ![]() |
|||
|
||||
COVD |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 11 Всего: 43 |
Отнюдь. Это просто и наглядно. Эти классы, если они небольшие, удобно создавать как анонимные (реализации интерфейса), т.е. не хранить каждый класс в отдельном файле.
Это сообщение отредактировал(а) COVD - 1.4.2012, 22:07 |
||||
|
|||||
C4Grey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 23.5.2007 Репутация: нет Всего: 1 |
2COVD
Спасибо за совет, действительно разумная альтернатива. Был не прав, упершись в модель "один класс - один модуль/файл". |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Работа с сетью | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |