【发布时间】:2010-10-08 01:48:17
【问题描述】:
我们正在运行一项需要与另一个进程快速通信的服务。目前,我们在缓冲模式下使用 WCF NetNamedPipeBinding 来调用服务中的方法,这似乎提供了可用 WCF 绑定的最少开销。有没有更快的方法使用托管代码来做到这一点?
编辑:如下建议的捆绑请求是一个已经考虑过的选项。真的,我们想知道是否有替代的 API 用于进程间通信,其性能优于使用命名管道的 WCF。
【问题讨论】:
我们正在运行一项需要与另一个进程快速通信的服务。目前,我们在缓冲模式下使用 WCF NetNamedPipeBinding 来调用服务中的方法,这似乎提供了可用 WCF 绑定的最少开销。有没有更快的方法使用托管代码来做到这一点?
编辑:如下建议的捆绑请求是一个已经考虑过的选项。真的,我们想知道是否有替代的 API 用于进程间通信,其性能优于使用命名管道的 WCF。
【问题讨论】:
如果您使用的是 WCF,那么命名管道是在本地系统上进行通信的最快方式。
如果您要抛出大量数据,那么您可以考虑流式传输您的 API(只需添加一个 System.IO.Stream 作为参数,而不是传递数组或字符串等)
同样对于性能而言,您的托管模型对于您的服务实例模式也非常重要。 Juval Lowy 关于 WCF 的书实际上非常好,如果您将代码示例深入到书中的内容中。
编辑:针对您的评论,请查看您可以应用于服务定义的“ServiceBehaviour”属性。 (不是你的 IServiceInterface 描述,而是你的类的具体实现)。
您可以通过 PerCall、PerSession 或 Singleton 将代码定义为实例。默认是 singleton PerSession(thanks @RichardOD) 并发模式设置为 single 并且 instanceContextMode 设置为 true,这允许您在 Windows 窗体上托管 WCF 并防止您在使用不明白实例化。
基本上,如果您将其保留为默认值,您最终会得到一个单线程、按顺序处理的 WCF 主机。
MSDN 有一些关于每种类型的作用的合理信息。
【讨论】:
那么,您是受容量限制(即大消息)还是往返限制(大量小消息)?
对于大消息,请考虑压缩(如果网络 IO 是开销)或更高效的序列化,例如 protobuf-net。
对于聊天 API,请考虑将消息分组以减少往返次数。
【讨论】: