Я расширяю существующую регистрационную библиотеку. Это система с двумя сторонами. Интерфейс - это то, где задачи записывают свои сообщения журнала, а бэкенд - это приложение, которое может подключать слушателей, в которые пересылаются эти сообщения различным приемникам. Бэкэнд раньше был одним проводным слушателем, теперь я расширяю его для гибкости. Код должен использоваться исключительно на встроенных устройствах, где высокая производительность (измеренная в количестве переадресованных байтов за миллисекунду) является очень важной задачей проектирования и реализации.
По соображениям производительности сообщения буферизуются, а пересылка выполняется в фоновом задании. Эта задача извлекает кусок сообщений из очереди, форматирует их все, а затем передает их слушателям через зарегистрированные функции. Эти слушатели будут фильтровать сообщения и будут записывать их только в их приемник, которые передают критерий фильтра.
Учитывая это, я получаю N
функции уведомления (слушатели) для отправки сообщений M
в довольно классическую проблему N*M
. Теперь у меня есть две возможности: я могу контактировать с сообщениями, а затем перебирать функции уведомлений, передавая сообщение каждому из них.
for(m in formatted_messages)
for(n in notification_functions)
n(m);
void n(message)
{
if( filter(message) )
write(message);
}
Или я мог бы перебрать все функции уведомлений и передать им все сообщения, которые у меня есть:
for(n in notification_functions)
n(formatted_messages);
void n(messages)
{
for(m in messages)
if( filter(m) )
write(m);
}
Существуют ли какие-либо основные соображения, относительно которых дизайн более вероятен для обработки большего количества сообщений на единицу времени? (Обратите внимание, как этот вопрос определяет интерфейс прослушивателя. Это не вопрос микро-оптимизации, а один о том, как создать дизайн, который не мешает производительности. Я могу измерить только намного позже, и перепроектирование интерфейса прослушивателя будет дорогостоящим.)
Некоторые соображения, которые я уже сделал:
- Те слушатели должны где-то писать сообщения, что довольно дорого, поэтому функция сама по себе может не быть слишком важной по производительности.
- В 95% всех случаев будет только один слушатель.