命名管道? XML-RPC?标准输入输出?网络服务?
我不会使用不安全的东西,如共享内存和类似的
答案 0 :(得分:9)
命名管道是最快的方法,但它仅适用于同一台计算机上的进程之间的通信。命名管道通信不会一直沿着网络堆栈(因为它只适用于同一台计算机上的通信)所以它总是会更快。
我遗漏了共享内存,因为你特别提到你不想走那条路。共享内存甚至比命名管道更快。
所以这取决于您是否只需要在同一台计算机或不同计算机上的进程之间进行通信。由于XML中的大量开销,任何基于XML的通信协议(例如,Web服务)通常都会变慢。
答案 1 :(得分:6)
我认为没有快速回答这个问题。如果我是你,我会购买/借用史蒂文斯和拉戈的Advanced Programming in the Unix Environment(APUE)副本,并阅读关于IPC的第15章和第16章。如果您真的想了解* nix(其中很多适用于任何POSIX系统)是如何工作到内核级别的,那么这本书是一本精彩的书。
如果你必须快速回答,我会按照效率的降序说明以下内容(没有加入大量的思考):
本地机器IPC
<强> Network IPC/Internet Sockets 强>
在这两个级别,您将不得不考虑如何对传输的数据进行编码/解码,并在内存使用和CPU利用率之间进行权衡。
在网络级别,您将不得不考虑将要运行的protcols层。最常见的是,在application layer的底部,您将在TCP / IP或UDP之间进行选择。 TCP有更多的开销,因为它有纠错,校验和和许多其他东西。如果您需要按顺序传递消息,则需要使用TCP而不是UDP。
除此之外还有其他协议,如HTTP,SOAP(在HTTP之上或其他协议,如FTP / SMTP等)。只要您是网络绑定而不是CPU绑定,二进制协议将更有效。如果在MS.Net平台上使用SOAP,那么消息的二进制编码将在网络上更快,但可能会占用更多CPU。
我可以继续。这不是一个简单的问题。学习延迟是什么以及如何处理缓冲是能够决定你总是被迫使用IPC的权衡的关键。如果你真的想知道引擎盖下发生了什么,我会推荐上面的APUE书。
答案 2 :(得分:2)
Windows Messaging是IPC的最快方式之一,后面的所有Windows都是基于它构建的。
可以将WM_COPYDATA与IPInvoke调用一起使用,以在两个基于表单的.Net应用程序之间交换数据,并且我有一个开源库来完成这项工作。我在一台相当热的笔记本电脑上以1771 msg /秒的速度进行了测试。
答案 3 :(得分:0)
我不知道为什么你不会使用共享内存,而是从同一台机器上的C#到C#应用程序非常快,并且非常可靠(与TCP套接字不同)。 spazzarama/SharedMemory是一个很棒的C#lib,它支持使用简单的高级API的共享数组和缓冲区。您只需使用公共内存文件名(在客户端/服务器端)初始化该类,然后更新该阵列。神奇的价值出现在另一边!