【问题标题】:In general, how expensive is calling an external program?一般来说,调用外部程序的成本是多少?
【发布时间】:2015-06-18 06:23:58
【问题描述】:

我知道调用外部程序can,但我不知道它与调用子程序相比有多昂贵。调用成本是指启动程序的开销,而不是执行程序代码本身的成本。我知道成本可能会因使用的语言和操作系统以及其他因素而有很大差异,但我会很感激一些大致的估计。

我希望通过让进程修改其他进程来查看在不允许代码自我修改的语言上模拟代码自我修改的合理性

【问题讨论】:

  • 也许对这个影响最大的是你使用的操作系统。我建议您直接尝试一下,即进行一些基准测试。
  • 一种中间方法是对某个外部服务器执行remote procedure call(这为您提供了与启动外部程序几乎相同的隔离,但您不会为每个 RPC 调用重新启动服务器)。在某些情况下,您可以根据自己的特定需求轻松编写临时 RPC 服务器。
  • 我忘了说RPC也可以去同一台电脑上的一些服务器程序,然后需要的IPC可以很快。细节当然是特定于操作系统的。
  • @BasileStarynkevitch 非常粗略地说,与普通子程序调用相比,远程过程调用需要多长时间?
  • 它是特定于操作系统的,并且通常(但不总是)取决于参数数据的大小。在使用管道或 FIFO 或AF_UNIX 套接字进行 RPC 的 Linux 上,您可以获得每秒数百兆字节的 IPC 带宽。如此短的 RPC 调用可能需要几百微秒,但您确实需要进行基准测试。

标签: optimization external


【解决方案1】:

就像我在my comment above 中所说的那样,您最好尝试一下并进行一些基准测试。我希望这主要取决于您使用的操作系统。

话虽如此,启动一个新进程通常比调用子程序慢几个数量级(我很想说“至少慢一百万倍”,但我不能'不要用任何测量来支持这样的声明)。

启动进程慢得多的可能原因:

  • 磁盘 I/O(操作系统必须将进程映像文件加载到内存中)——这将是一个重要因素,因为 I/O 比简单的 CPU 跳转/调用指令慢很多数量级。

    为了让您大致了解所涉及的数量级,让我引用this 2011 blog article(这是关于内存访问与硬盘访问,而不是 CPU 跳转指令与硬盘访问):

    “磁盘延迟约为 13 毫秒,但取决于硬盘驱动器的质量和旋转速度。RAM 延迟约为 83 纳秒。差异有多大?如果 RAM 是 F-18 Hornet 的最高速度为 1,190 mph(超过音速的 1.5 倍),磁盘访问速度是香蕉蛞蝓,最高速度为 0.007 mph。"

    你自己算算。

  • 内存分配和其他内核数据结构

  • 在内存中布置进程映像并执行重定位
  • 创建新的操作系统线程
  • 上下文切换

等等

显然,以上所有几点都意味着您的操作系统可能会执行大量内部子例程调用来启动一个新进程,因此您只需自己调用一个子例程,而不是让操作系统执行数百次其中肯定会相对超级便宜。

【讨论】:

  • 如果文件已经位于page cache 中,磁盘 IO 无关紧要,这通常发生在常用文件(或可执行文件)中。
  • @BasileStarynkevitch:当然,但也许你不能依赖它。鉴于操作系统之间的可移植性不是问题,并且您使用的操作系统为您提供了某些缓存保证,那么磁盘 I/O 确实可能并不重要(除了第一个进程加载)。但在所有其他情况下,我宁愿假设最坏的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2010-11-15
  • 2010-09-10
  • 2014-11-12
  • 1970-01-01
相关资源
最近更新 更多