一般来说,调用外部程序的成本是多少?

In general, how expensive is calling an external program?

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

我想看看在不允许代码自修改的语言上模拟代码自修改的合理性,方法是让进程修改其他进程

就像我在 中所说的那样,如果您只是简单地尝试一下并进行一些基准测试,也许会更好。我希望这主要取决于您使用的 OS。

也就是说,启动一个新进程通常 比调用子例程慢 多个数量级(我很想说 "at least a million times slower",但是我无法用任何测量来支持这样的说法。

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

  • Disk I/O(OS 必须将进程映像文件加载到内存中)— 这将是一个重要因素,因为 I/O 很多比简单的 CPU jump/call 指令慢几个数量级。

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

    "Disk latency is around 13ms, but it depends on the quality and rotational speed of the hard drive. RAM latency is around 83 nanoseconds. How big is the difference? If RAM was an F-18 Hornet with a max speed of 1,190 mph (more than 1.5x the speed of sound), disk access speed is a banana slug with a top speed of 0.007 mph."

    你算一下。

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

  • 在内存中布置过程映像并执行重定位
  • 创建新的 OS 线程
  • 上下文切换

等等

显然,以上所有几点都意味着 您的 OS 可能会执行大量内部子程序调用以启动新进程,因此只执行一个子程序打电话给自己,而不是让 OS 做成百上千的这些肯定是相对超便宜的。