|
Модераторы: Daevaorn |
|
boostcoder |
|
||||
pattern`щик Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
всем доброго вечера.
хочу написать обертку над asio сокетом, дабы улучшить юзабильность. хочу избавиться от ручного написания байнда и хранения записываемого буфера до окончания асинхронной операции. это и хочу обсудить. сейчас вижу интерфейс таким:
чтоб использовать так:
первый вопрос - есть ли смысл вообще в обертке? второй вопрос - в случае записи указателя на char, есть ли смысл копировать данные в какой-то внутренний буфер обертки? или просто запоминать указатель, по при вызове хэндлера - освобождать память на которую он указывает? третий вопрос - что вообще нужно такой обертке, и что не нужно? спасибо. |
||||
|
|||||
borisbn |
|
||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
думаю есть, т.к. довольно часто приходится делать одно и то же, наступать на те же грабли, копипастить... брррр IMHO однозначно копировать. чтобы не получилось такой ситуации
IMHO лучше интерфеса, чем этот не придумаешь Это сообщение отредактировал(а) borisbn - 10.4.2011, 23:53 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
bsa |
|
||||
Эксперт Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
|
||||
|
|||||
boostcoder |
|
|||
pattern`щик Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
допустим... тогда встает вопрос о размере внутреннего буфера обертки. 1. должен указываться в конструкторе? 2. или увеличивается столько, сколько свободной памяти на машине? 3. расходы на выделение памяти/копирование не пугают? у меня есть такое предложение: обязать пользователя передавать в сокет смарт_поинтер инициализированный/заполненный юзером. в этом есть есть два плюса: 1. не нужно ничего копировать. т.к. внутренний буфер становится очередью из смарт_поинтеров 2. не нужно руками освобождать память. |
|||
|
||||
mes |
|
|||
любитель Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
borisbn |
|
||||||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
IMHO некрасиво
внутренний буфер будет увеличиваться только в том случае, если юзер будет подавать данные быстрее, чем они будут уходить получателю... Если юзер так рассчитал систему - то он сам виноват. Библиотека (обёртка) тут не при чём. Думаю, что сама отправка (скорость передачи по каналу) будет на порядки дольше, чем обращение к менеджеру памяти и копирование из одной области памяти в другую. Даже если передача данных будет происходить по 127.0.0.1
В этом случае юзерская ф-ция отправки, например, строки будет выглядеть некрасиво
вместо
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||||
|
|||||||||
boostcoder |
|
||||||||||||
pattern`щик Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
тут Вы ошибаетесь. в этой теме, возьмите последние исходники и посмотрите. там очень простой код. выделение 13 байт, sprintf(), передача в async_write(), в хэндлере delete[]. ничего сложного ведь ;) но на 100мбитной сети, происходит 220000-250000 таких последовательностей, что полносьтю загружает одно ядро. вроде бы казалось, ничего сложного в этих операциях нет. но профайлер говорит что 48 процентов времени уходит только на new! в общем, выделение памяти и инициализацию смарт_поинтера оставил на юзера. помоему, очень даже юзабельно получилось пожелания/рекомендации/критика приветствуются. класс сокета:
пример 1:
пример 2:
пример 3:
всем спасибо Добавлено через 6 минут и 9 секунд
не нравится постоянно писать байнд. в добавок, если сигнатура не соответствует, или не соответствует кол-во плейсхолдеров, или их вовсе нет - то глядеть в 120 строк вывода об ошибке сомнительное удовольствие. Это сообщение отредактировал(а) boostcoder - 11.4.2011, 16:35 Присоединённый файл ( Кол-во скачиваний: 2 ) simplesocket.zip 3,33 Kb |
||||||||||||
|
|||||||||||||
boostcoder |
|
|||
pattern`щик Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
эм... такой вопрос: а есть ли смысл добавлять методы для синхронных операций?
IMHO - лишнее. |
|||
|
||||
borisbn |
|
||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
профайлер не знает, сколько времени уходит непосредственно на отправку/приём, т.к. они асинхронные В Вашем примере ровно столько же new делается на стороне клиента юзера
думаю, что эти new как-то можно соптимизировать. и лучше это сделать в одном месте - в обёртке, а не каждый раз у юзера. А не замахнуться ли нам на Вильяма нашего Собственного Менеджера Памяти думаю, Вы правы. Лишнее. А вот добавить [необязательные] handler'ы connected и disconnected можно -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
boostcoder |
|
||||
pattern`щик Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
это да. но я хотел сказать то, что ко всем new не нужно еще и добавлять расходы на копирование.
как, например? пул памяти? ага. а потом кто-то скажет еще добавить аксессоры для ip:port, и что-то еще у обертки есть метод socket() который возвращает ссылку на внутренний сокет. а у него есть все необходимые методы. эта обертка - всего лишь сокет. над ней можно написать другую обертку, к примеру обертку сериализатора/десериализатора для абстрагирования от типа. т.к. сейчас обертка работает только с массивом чаров. Это сообщение отредактировал(а) boostcoder - 11.4.2011, 18:24 |
||||
|
|||||
boostcoder |
|
|||
pattern`щик Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
mes |
|
|||
любитель Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
boostcoder |
|
|||
pattern`щик Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mes, спасибо.
я никогда не понимал классику. потому не смотрел. потому не знаю таких высказываний. хотя... Кин-дза-дза мне нравится. помоему это единственное из классики что я могу посмотреть без принуждения.. Это сообщение отредактировал(а) boostcoder - 11.4.2011, 18:44 |
|||
|
||||
boostcoder |
|
|||
pattern`щик Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
mes, кстати. как Вам такой сокет? ;)
|
|||
|
||||
phprus |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 129 Регистрация: 22.8.2006 Репутация: 1 Всего: 3 |
Аллокации, влияют не так сильно, а вот копирование памяти, ее предварительное зануление(если используется std::vector) начинает тормозить уже на скорости обмена с сетью порядка 200Мбит/с (выведено из опыта излишней буферизации в своем приложении), то есть скорость работы приложения ограничивается скоростью копирования памяти. shared_ptr не может принимать массивы, и не во всех случаях безопасен при многопоточности. В первом случае есть shared_array, а второй так просто не решается :( |
|||
|
||||
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |