Большинство обращений к so_4::api::send_msg() в SObjectizer-приложениях выполнялось с использованием одного или нескольких строковых литералов. Наверное, одним из самых распространенных сценариев использования so_4::api::send_msg() был следующий:
so_4::api::send_msg_safely( so_query_name(), "msg_some_action", new msg_some_action( ... ) );
В версии 4.4.0-beta6 аргументы типа std::string и const char * были заменены аргументами специального типа string_piece_t. Особенностью класса string_piece_t является то, что является всего лишь маленькой структурой, которая хранит указатель на начало строки и длину строки. Поэтому ни в случае std::string, ни в случае строкового литерала не происходит выделения динамической памяти или копирования строкового значения. Максимальные затраты в случае строкового литерала -- это обращение к std::strlen() для определения длины строки.
За счет этого в версии 4.4.0-beta6 удалость существенно поднять скорость выполнения операции so_4::api::send_msg().
so_4::api::send_msg( so_query_name(), "msg_some_delayed_signal", 0, // Нет данных для сообщения. 0, // Нет получателя сообщения. 1000 // Есть задержка. );
Поэтому, начиная с версии 4.4.0-beta6 для указания широковещательной отсылки (т.е. отсутствия имени получателя сообщения) нужно использовать функцию so_4::api::receiver_unknown(). А приведенный выше фрагмент будет выглядеть как:
so_4::api::send_msg( so_query_name(), "msg_some_delayed_signal", 0, // Нет данных для сообщения. so_4::api::receiver_unknown(), // Нет получателя сообщения. 1000 // Есть задержка. );
Документация по SObjectizer v.4.4 'Тебуломста'. Последние изменения: Thu Sep 18 10:26:48 2008. Создано системой 1.5.6 |