我正在扩展现有的日志库。这是一个有两个方面的系统:前端是任务将日志消息写入的地方,后端是应用程序可以插入侦听器的地方,侦听器将这些消息转发到不同的接收器。后端曾经是一个硬连线的监听器,我现在正在扩展它以提高灵活性。该代码将专门用于嵌入式设备,其中高性能(以每毫秒转发的字节数衡量)是非常重要的设计和实现目标。
出于性能原因,消息被缓冲,并且在后台任务中完成转发。该任务从队列中获取大量消息,将它们全部格式化,然后通过注册函数将它们传递给侦听器。这些侦听器将过滤消息,并且只会将那些通过过滤条件的消息写入其接收器。
鉴于此,我最终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% 的情况下,只有一个听众。