使用进程间通信(IPC)的性能影响

5
IPC(进程间通信)的使用类型是什么?使用IPC发送数百个字符大小的JSON块是否可行?我应该尽可能地缩小IPC消息的大小,还是减小消息大小带来的性能提升不值得努力?

1
我对这个也很感兴趣,我会以数据URL的格式发送图像,可能会达到1MB的大小。 - Michael Radionov
这取决于操作系统和IPC技术,因此通用的回答涵盖Windows、Linux和OS X是不可能的。 - zneak
1个回答

7
IPC的使用类型是什么,使用IPC发送更大的JSON块(数百个字符)是否可以?
IPC本质上就是它所说的那样。当您需要在进程之间通信时,它是一种工具,无论通信内容是什么。该主题非常广泛,从技术上讲,包括分配共享内存并手动进行通信,但鉴于问题的语气和标签,我假设您正在谈论操作系统提供的设施。
Wikipedia 很好地讨论了IPC的用途,我认为我无法做得更好,因此我将集中讨论第二个问题。
我应该尝试使用IPC发送尽可能小的消息,还是减少消息大小带来的性能收益不值得努力?这有点像微观优化。我不能确定,因为我不知道Microsoft和Apple的源代码,而且我真的不想深入研究Linux内核对IPC的实现,但是有几个要点:
  1. IPC是一种常见的操作,因此操作系统设计者很可能会优化它以提高效率。有一些工程师团队考虑了这个问题并想出了如何使其快速的方法。
  2. 跨进程/线程的通信瓶颈几乎总是同步。延迟是不好的,但竞争条件和死锁更糟。然而,由于系统控制进程调度程序和内存管理器,因此有许多创造性的方法可以加速该过程。
  3. 有许多方法可以使数据传输本身更快。对于操作系统来说,如果数据需要跨进程边界,则可能需要进行一些复制,但操作系统始终在各个地方复制内存。想想命令行实用程序,例如netstat。运行该可执行文件时,需要分配内存,从磁盘加载进程,并进行任何操作系统需要执行的地址修正,然后才能启动进程。这样做非常快,您几乎都不会注意到。在Windows上,netstat大约为40k,并且几乎立即加载到内存中。(另一个快速加载器Notepad大小是它的10倍,但仍然可以在短时间内启动。)
  4. 上述第2点的一个重要例外是,如果您正在谈论不在同一台计算机上的进程之间的IPC,则您确实受限于网络/通信堆栈的速度,但此时这里或那里的几KB并不会有太大的区别。(您可以将AJAX视为一种IPC形式,其中“进程”是服务器和您的浏览器。现在考虑Google Docs运行的速度有多快。)
如果IPC在同一系统上的进程之间进行,则我认为没有必要花费大量精力从消息中刮掉字节。使您的消息易于调试。
如果通信发生在不同计算机上的进程之间,则您可能需要考虑一些事情,因为花费了很多时间来调试问题,而这些问题可以通过更好的数据格式轻松解决,几十毫秒的传输时间不值得让数据更难解析/调试。记住优化的三个规则1
1. 不要。 2. 不要……但是(对于专家)。 3. 在执行优化之前进行性能分析。

1 前两条规则通常被归功于迈克尔·杰克逊。(这个 而不是 那个)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接