Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> реализация алгоритма 
:(
    Опции темы
boostcoder
Дата 9.11.2011, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mabrarov @  9.11.2011,  13:46 Найти цитируемый пост)
Arg - это параметр для конструктора lower_layer. В случае, если lower_layer есть asio::ip::tcp::socket, то Arg - это asio::io_service&. Тут все аналогично asio::ssl::stream. Это вообще общая техника для оберток в Asio.

да, уже разобрался. все просто.

Цитата(mabrarov @  9.11.2011,  13:46 Найти цитируемый пост)
Можно попробовать asio::async_read + asio::transfer_at_least(минимальный размер пакета).

тут нужно начать с написания теста по предыдущей реализации, и задуманной. этим и займусь.

и да, если с докой что-то не так, всегда можно исходники почитать. ну, на крайняк, самому написать доку и отослать автору патч. не думаю что он сильно расстроится.

Это сообщение отредактировал(а) boostcoder - 9.1.2012, 15:51
PM WWW   Вверх
mabrarov
Дата 9.11.2011, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 12.1.2011
Где: Казань

Репутация: 8
Всего: 9



Цитата(boostcoder @ 9.11.2011,  14:07)
Ну, на крайняк, самому написать доку и отослать автору патч. не думаю что он сильно расстроится.

Я бы на его месте поленился тащить такую ношу (+ несколько платформ) в одиночку да еще и бесплатно. Видимо, он что-то имеет с консультаций. Вроде что-то проскакивало про Австралию и custom-solution для гос/научного учреждения... Вот посмотрите на ACE. Сколько гос-бабла туда вбухали США? И как Вам документация (я уж молчу про код и что про него мне сказали в Y).
PM MAIL WWW Skype   Вверх
boostcoder
Дата 9.11.2011, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mabrarov @  9.11.2011,  14:20 Найти цитируемый пост)
И как Вам документация

дока ужасная, какой всегда и была, сколько я ее помню.
PM WWW   Вверх
boostcoder
Дата 16.4.2012, 07:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



вот только на один момент никто(?) не обратил внимания: используя asio::buffered_stream мы избавляемся от длиной цепочки вызовов и одного сискола, но взамен добавляем операцию копирования из asio::buffered_stream в передаваемый буфер. а это не малое копирование. это копирование всего трафика.
как считаете, будет ли такая оптимизация оправданна?


Это сообщение отредактировал(а) boostcoder - 16.4.2012, 07:17
PM WWW   Вверх
mabrarov
Дата 16.4.2012, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 12.1.2011
Где: Казань

Репутация: 8
Всего: 9



Цитата(boostcoder @ 16.4.2012,  07:16)
вот только на один момент никто(?) не обратил внимания: используя asio::buffered_stream мы избавляемся от длиной цепочки вызовов и одного сискола, но взамен добавляем операцию копирования из asio::buffered_stream в передаваемый буфер. а это не малое копирование. это копирование всего трафика.

А разве могло быть иначе?

Цитата(boostcoder @ 16.4.2012,  07:16)
как считаете, будет ли такая оптимизация оправданна?

Я думал, что на этом и последующих ответах тема себя исчерпала.
Это почти стандартный подход:
  • (циклический) буфер;
  • читаем (read_some) столько, сколько влезает в свободную часть буфера, т.е. стремимся сократить кол-во обращений к сокету - можно добавить asio::transfer_at_least(подсказка от парсера по минимальному кол-ву байт для завершения разбора очередного сообщения);
  • парсер входящих сообщений на КА;
  • копирование разобранного сообщения в отдельный объект и передача его через указатель (можно с shared-семантикой) дальше в логику обработки сообщений (еще один или несколько КА).


Это сообщение отредактировал(а) mabrarov - 16.4.2012, 11:29
PM MAIL WWW Skype   Вверх
boostcoder
Дата 16.4.2012, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mabrarov @  16.4.2012,  11:25 Найти цитируемый пост)
Я думал, что на этом и последующих ответах тема себя исчерпала.

я тоже так думал. но как дошел до реализации, одумался smile

PM WWW   Вверх
mabrarov
Дата 16.4.2012, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 12.1.2011
Где: Казань

Репутация: 8
Всего: 9



Цитата(boostcoder @ 16.4.2012,  13:03)
... но как дошел до реализации, одумался smile

Почему? Реализация описанного выше (буфер, чтение, парсер на КА, логика на КА) получается слишком запутанной? Или Вы написали это про asio::buffered_stream? 
IMHO: asio::buffered_stream не стоит тянуть в свои проекты. "Чтение с запасом + парсер-КА" универсальнее.

Это сообщение отредактировал(а) mabrarov - 16.4.2012, 14:02
PM MAIL WWW Skype   Вверх
boostcoder
Дата 16.4.2012, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mabrarov @  16.4.2012,  13:25 Найти цитируемый пост)
Реализация описанного выше (буфер, чтение, парсер на КА, логика на КА) получается слишком запутанной?

и это тоже. но основное - копирование всего трафа. но, как я понимаю, по другому быть не может. это я, хочу странного =)

КА мне тоже по идее не нужны. по сети будут передаваться массивы бинарного сериализатора. т.е. при прочтении, массив передается десериализатору.

Цитата(mabrarov @  16.4.2012,  13:25 Найти цитируемый пост)
IMHO: asio::buffered_stream не стоит тянуть в свои проекты.

по Вашему мнению, почему?

Цитата(mabrarov @  16.4.2012,  13:25 Найти цитируемый пост)
"Чтение с запасом + парсер-КА" универсальнее.

объясните плиз более развернуто, для чего тут КА и кем является "парсер"?

PM WWW   Вверх
mabrarov
Дата 16.4.2012, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 12.1.2011
Где: Казань

Репутация: 8
Всего: 9



Цитата(boostcoder @ 16.4.2012,  18:56)
и это тоже. но основное - копирование всего трафа. но, как я понимаю, по другому быть не может. это я, хочу странного =)

Это возможно, когда десериализация не требует ничего кроме копирования. Тогда по заголовку сообщения можно сразу выделять буфер нужного размера и тогда же не удастся сэкономить на обращениях к сокету.

Цитата(boostcoder @ 16.4.2012,  18:56)

КА мне тоже по идее не нужны. по сети будут передаваться массивы бинарного сериализатора. т.е. при прочтении, массив передается десериализатору.

У нас наметилось явное недопонимание: 
парсер == десериализатор.

Цитата(boostcoder @ 16.4.2012,  18:56)
Цитата(mabrarov @  16.4.2012,  13:25 Найти цитируемый пост)
IMHO: asio::buffered_stream не стоит тянуть в свои проекты.
по Вашему мнению, почему?

Потому что это лишнее, если Ваш десериализатор умеет парсить данные из буфера приема и может продолжать парсить частично полученные сообщения. Обработка того же протокола заголовок-с-размером-тела+тело - есть простейший парсер/десериализатор.. в книжках по ACE эту часть называют... эээ... frame protocol, что ли.
PM MAIL WWW Skype   Вверх
boostcoder
Дата 17.4.2012, 02:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mabrarov @  16.4.2012,  20:16 Найти цитируемый пост)
Это возможно, когда десериализация не требует ничего кроме копирования. Тогда по заголовку сообщения можно сразу выделять буфер нужного размера и тогда же не удастся сэкономить на обращениях к сокету.

что-то я совсем запутался %)

сначала я запрашиваю у сокета прочитать заголовок. из него я узнаю размер тела. и делаю еще один запрос на чтение тела.
это сейчас так. и тут у нас проблема с двумя цепочками вызовов для получения одного пакета.

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

к тому же, то, что я описал в топике, не предполагало копирование всего трафа, ибо там я предполагал передавать итераторы.
как-то так:
Код

socket s(...);
buffer b(s); // но нам не известен заранее максимальный размер буфера

...

int header = 0;
b.async_read(
   sizeof(header),
   [](const char *ptr, size_t size, error_code e) {
      // ptr - указатель на буфер
      из ptr получаем размер тела...
      ...
      b.async_read(
         header,
         [](const char *ptr, size_t size, error_code e) {
            все! получили тело!
            десериализуем.
         }
      );
   }
);



Это сообщение отредактировал(а) boostcoder - 17.4.2012, 03:12
PM WWW   Вверх
boostcoder
Дата 17.4.2012, 03:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



я думаю скопипастить реализацию asio::buffered_read_stream и переделать ее для работы с итераторами...

Добавлено через 3 минуты и 34 секунды
проблему неизвестного максимального размера буфера, я думаю, можно решить дополнительным буфером, который будет создаваться если запрошен размер превышающий максимальный размер дефолтного буфера.
большинство пакетов имеют размер до 20ти байт.

PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.