- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在扩展现有的日志库。这是一个有两个方面的系统:前端是任务将日志消息写入的地方,后端是应用程序可以插入监听器的地方,监听器将这些消息转发到不同的接收器。后端曾经是一个硬连线的监听器,我现在正在扩展它以提高灵 active 。该代码将专门用于嵌入式设备,其中高性能(以每毫秒转发的字节数衡量)是一个非常重要的设计和实现目标。
出于性能原因,消息被缓冲,并且转发在后台任务中完成。该任务从队列中获取大量消息,将它们全部格式化,然后通过注册函数将它们传递给监听器。这些监听器将过滤 消息,并且只会将那些通过过滤条件的消息写入其接收器。
鉴于此,我最终拥有 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);
}
对于哪种设计更有可能允许每个时间片处理更多的消息,是否有任何基本考虑? (注意这个问题是如何决定监听器的接口(interface)的。这不是一个微优化问题,而是一个关于如何进行不影响性能的设计的问题。我只能在很久以后才能测量,然后重新设计监听器接口(interface)将是昂贵的.)
我已经做了一些考虑:
最佳答案
Is there any fundamental considerations regarding which design is more likely to allow a higher number of messages to be processed per time slice?
一般来说,与此相关的主要考虑因素通常归结为两个主要方面。
如果您的循环中的一个循环遍历可能具有良好内存局部性的对象(例如循环遍历一组值),则将该部分保留在内部循环中可能会将对象保留在 CPU 缓存中,并提高性能。
如果您打算尝试并行化操作,在外循环中保持“更大”(以计数计)集合可以让您有效地并行化外循环,并且不会导致线程订阅过多等. 在外层并行化算法通常更简单、更清晰,因此在外层循环设计具有潜在更大并行工作“ block ”的循环可以简化这一点,如果以后有可能的话。
Those listeners need to write the messages somewhere, which is rather expensive, so the function calls by themselves might not be too important performance-wise.
这可能会完全抵消将一个循环移到另一个循环之外的任何好处。
In 95% of all cases, there will only be one listener.
如果是这种情况,我可能会将监听器循环置于外部范围,除非您计划并行化此操作。鉴于这将在嵌入式设备上的后台线程中运行,并行化是不可能的,因此将监听器循环作为外部循环应该减少总指令数(它实际上变成了 M 个操作的循环,而不是 M 个循环一次操作)。
关于c++ - 选择任一循环作为外循环是否有优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17350034/
首先对WCF与WebService的定义进行概括,接着介绍了WCF的优势,最后就是对WCF与WebService两者的根本区别进行比较,具体内容如下 1、定义 1.WebService:严格来
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 5年前关闭。 Improve t
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
谁能告诉我将下一个脚本标记放在 元素之后和将它放在 元素之前有什么好处? (function (){ var script = document.createElement("script"); s
我最近遇到了一个 JavaScript 脚本,其中作者似乎试图避免在代码中使用字符串并将所有内容都分配给一个变量。 所以代替 document.addEventListener('click', (e
Scott Meyers 在“Effective Modern C++”中说表达式 Matrix sum = m1 + m2 + m3 + m4 (其中所有对象的类型均为 Matrix)“如果 ope
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
免责声明:我是网络开发的新手,所以请多多包涵... 堆栈:Angular 前端,后端的 Tornado(基于 python)网络服务器 我一直在使用 RxJs 和 WebSocket 成功地与后端通信
我一直在调查我的 Flutter 应用程序的 JSON 解析,并且有一个关于我无法解决的工厂构造函数的问题。我试图了解使用工厂构造函数与普通构造函数的优势。例如,我看到很多 JSON 解析示例,它们使
添加 SQL 后尝试打开 TadsQuery 时出现 5400 AE_INTERNAL_ERROR。当我将相同的 SQL 直接放在 TadsQuery 中时,没有错误。您的帮助文件指示我联系 Adva
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improv
我想定义一个函数,当给定一个整数时,它将返回一个字符串。像这样: # Pseudocode function get_string(i) return my_string_array[i] end
我曾尝试在 Linux 和 Windows 上使用 DBD::Advantage,但没有成功。 Windows 版本附带了一个看似完整的安装程序,但它留下了 DBD-Advantage-8.10.ta
为什么说 NoSQL 在结构上比某些 SQL 数据库更快?假设我在某个 SQL 表的列上添加了一些索引。有人可以提供某种更快的查询吗? 我正在阅读有关 redis 的内容。 class User <
我的问题很简单:如果接口(interface)由单个类实现,那么使用接口(interface)有什么好处吗? 我一直认为只有当该接口(interface)有多个实现时,接口(interface)才是好
考虑这些(或多或少)等价的类型签名: f1 :: [a] -> Int -> a f2 :: Integral b => [a] -> b -> a f2 比 f1 更通用,这是一个很大的优势,但是
我们在 Scala 中部分应用了函数- def sum(a:Int,b:Int,c:Int) = a+b+c val partial1 = sum(1,_:Int,8) 我想知道使用部分应用函数的优点
你看下面的代码,我是如何使用 session 变量的;所以这三个问题是: 它们存放在哪里? (服务器或客户端) 它们对于每个网页访问者来说都是独一无二的吗? 我可以在完成工作后使用 ajax 或简单的
我知道这是一个常见问题,互联网上有关于此主题的资源,但我想从这个社区了解每个人在部署博客时对子域与子文件夹的想法(SEO 优势)。 谢谢。 最佳答案 我研究过一次,根据社区反馈以及权衡利弊,我会说去一
我是一名优秀的程序员,十分优秀!