我正在开发一个由一些独立流程(服务)组成的项目。一些服务每秒调用一次,其他一些服务每分钟调用一次,一些服务可能在几天之后调用。 (并且有些服务是随机调用的,并且没有关于其通话时间的确切信息。)
我有两种开发项目的方法。使服务始终使用进程间消息传递来运行进程,或者在需要时编写单独的C ++程序并运行可执行文件。
我有两个问题,我无法找到合适的答案。
编辑1:正如评论和Mats Petersson的回答中提到的,回答我的问题与环境密切相关。然后我会详细解释这些条件
操作系统:CentOS 6.3
服务很小(通常小于1000行代码)并且不使用其他资源(例如数据库)
答案 0 :(得分:1)
我认为任何人都不能回答你直接的两个问题,因为它取决于很多因素,例如“什么操作系统”,“什么是辅助存储”,“应用程序有多大”,“你的应用程序做什么” (加载具有一百万个条目的数据库的内容比在{main}之外的整个初始化的int x = 73;
花费更长的时间。)
两种方法都存在开销,并且假设没有足够的内存可以随时在RAM中保存所有内容(现代操作系统会尝试将RAM用作磁盘缓存或其他缓存,而不是保留没有运行的旧硬件应用程序代码,因此如果它没有被运行,最终你的应用程序代码将被换出),你将为这两个解决方案提供大约相同的磁盘I / O数量。
对我而言,“拥有可用内存”胜过其他事情,因此在需要时执行一个流程比让它运行时更好,期望在一段时间内,它需要重复使用。唯一的例外是如果可执行文件需要很长时间才能启动(换句话说,它很大并且具有复杂的启动过程)并且它运行得相当频繁(至少每分钟几次)。或者你有很高的实时要求,所以启动过程的额外延迟明显比“我们在内存中持有”惩罚更糟糕(但要记住,将它保存在内存中并不是真的把它保存在内存中,因为无论如何,内容都会被换出到磁盘上。
启动最近运行的进程通常是从缓存完成的,因此它不是问题。此外,如果应用程序使用真正共享的共享库(.so,.dll或.dynlib,具体取决于操作系统),那么如果共享库已经在内存中,它通常会缩短加载时间。
Linux和Windows(我希望OS X)都经过优化,可以在第二次连续执行时加快程序加载速度 - 因为它可以缓存事物等等。因此,对于频繁调用可执行文件,这肯定会对你有利。
我会从“每次执行”开始,如果您发现这会导致问题,请重新设计程序以保持不变。