我正在扩展一个现有的日志库(logging library)。它是一个有两个方面的系统: 前端是任务将其日志消息写入的地方,后端是应用程序可以插入侦听器(forward those messages to different sinks)的地方。后端过去只有一个硬连线的监听器,我现在正在扩展它以实现灵活性。该代码将被专门用于嵌入式设备,其中高性能(以每毫秒转发的字节数衡量)是非常重要的设计和实现目标。
出于性能原因,消息被缓冲,并且在后台任务中进行转发。该任务从队列中获取一块消息,所有格式化后将它们传递给已注册的函数通过侦听器。这些侦听器会过滤(filter)消息,并且只会将通过筛选条件的消息写入到其汇流处。
鉴于此,我最终需要向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%只会有一个侦听器。
N*M
。 - user529758