Optimization 一般来说,调用外部程序的成本有多高?

Optimization 一般来说,调用外部程序的成本有多高?,optimization,external,Optimization,External,我知道可以调用外部程序,但我不知道与调用子程序相比,它有多昂贵。所谓调用成本,我指的是启动程序的开销,而不是执行程序代码本身的成本。我知道成本可能会因所使用的语言和操作系统以及其他因素的不同而有很大差异,但我希望能给出一些大致的估计 我想通过让进程修改其他进程来模拟不允许代码自修改的语言上的代码自修改的合理性,正如我在中所说的,如果您只是简单地尝试一下并进行一些基准测试,可能会更好。我认为这主要取决于您使用的操作系统 也就是说,开始一个新的过程通常比调用一个子程序慢很多个数量级,我想说至少慢一百

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

我想通过让进程修改其他进程来模拟不允许代码自修改的语言上的代码自修改的合理性,正如我在中所说的,如果您只是简单地尝试一下并进行一些基准测试,可能会更好。我认为这主要取决于您使用的操作系统

也就是说,开始一个新的过程通常比调用一个子程序慢很多个数量级,我想说至少慢一百万倍,但我不能用任何测量来支持这样的说法

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

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

为了让您大致了解所涉及的数量级,请允许我引用有关内存访问与HDD访问的内容,而不是CPU跳转指令与HDD访问的内容:

磁盘延迟约为13毫秒,但这取决于硬盘的质量和旋转速度。RAM延迟约为83纳秒。差别有多大?如果RAM是F-18大黄蜂,最大速度为1190英里/小时,超过音速的1.5倍,则磁盘访问速度是香蕉弹头,最高速度为0.007英里/小时

你来算吧

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

在内存中布局进程映像并执行重新定位 创建新的操作系统线程 上下文开关 等等


显然,上述所有要点都意味着,您的操作系统可能会执行大量内部子例程调用来启动新进程,因此,您自己只执行一个子例程调用而不是让操作系统执行数百个这样的调用,这肯定是相对超低的成本。

对这一点影响最大的可能是您使用的操作系统。我建议您直接尝试一下,即进行一些基准测试。中间的方法是对一些外部服务器进行测试,这与启动一个外部程序几乎相同,但不会为每次RPC调用重新启动服务器。在某些情况下,您可以根据自己的特定需要轻松编写一个临时RPC服务器。我忘了告诉您,RPC也可以转到同一台计算机上的某个服务器程序,然后所需的程序可以非常快。详细信息当然是操作系统特有的。@BasileStarynkevitch非常粗略地说,远程过程调用与普通子例程调用相比需要多长时间?它是操作系统特有的,通常但并不总是取决于参数数据的大小。在使用管道、FIFO或AF_UNIX套接字进行RPC的Linux上,每秒可以获得数百兆字节的IPC带宽。因此,短的RPC调用可能需要几百微秒,但您确实需要进行基准测试。磁盘IO与文件是否已位于中无关,对于常用文件或可执行文件,这种情况经常发生。@basilestrynkevitch:当然,但您可能无法依赖于此。考虑到操作系统之间的可移植性不是问题,并且您使用的操作系统为您提供了某些缓存保证,那么磁盘I/O除了在第一个进程负载上之外可能没有多大关系。但在所有其他情况下,我宁愿假设最坏的情况。