我正在扩展现有的日志库。它是一个双面的系统:前端是任务写入日志消息的地方,后端是应用程序可以插入侦听器的地方,将侦听器转发给不同的接收器。后端曾经是一个硬连线的监听器,我现在扩展这个灵活性。该代码仅用于嵌入式设备,其中高性能(以每毫秒转发的字节数衡量)是非常重要的设计和实现目标。选择任一循环作为外循环是否有优势?
由于性能方面的原因,消息被缓存,转发在后台任务中完成。该任务从队列中提取一大块消息,将它们全部格式化,然后通过注册函数将它们传递给监听器。那些听众将过滤器消息,并将只写入他们的汇,通过过滤器标准。
鉴于此,我最终得到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%的情况下,只有一个听众。
有些东西告诉我,选择循环遍历函数作为外部循环(即循环遍历函数,然后通过消息)可能会更有效率,但也许这只是错误的直觉,你甚至不应该听我说。 – 2013-06-27 17:59:01
你能组合发送给同一个监听器的多条消息吗? – Mysticial
第一种方法是M * N,但秒对我来说似乎是N.这可能吗? – StackedCrooked