Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 内存映射文件是否比命名管道更快?_C#_.net_Tcp_Named Pipes_Communication Protocol - Fatal编程技术网

C# 内存映射文件是否比命名管道更快?

C# 内存映射文件是否比命名管道更快?,c#,.net,tcp,named-pipes,communication-protocol,C#,.net,Tcp,Named Pipes,Communication Protocol,我正在阅读SQL Server内部构件和故障排除(Wrox),它有效地指出,共享内存是默认的连接方法,然后是TCP,然后是命名管道。但奇怪的是,他们说: “命名管道是为局域网(LAN)开发的,但在速度较慢的网络(如广域网(WAN))中可能效率低下” 我以为命名管道完全是为了IPC?为了从IPC跳到网络通信,必须使用TCP/UDP。不过,我更感兴趣的是提到共享内存/内存映射文件——它们比命名的管道/IPC快吗?答案是,像往常一样,“这取决于”。如果涉及到大量数据,共享内存将大大减少复制数据的开销。

我正在阅读SQL Server内部构件和故障排除(Wrox),它有效地指出,
共享内存
是默认的连接方法,然后是TCP,然后是命名管道。但奇怪的是,他们说:

“命名管道是为局域网(LAN)开发的,但在速度较慢的网络(如广域网(WAN))中可能效率低下”


我以为命名管道完全是为了IPC?为了从IPC跳到网络通信,必须使用TCP/UDP。不过,我更感兴趣的是提到共享内存/内存映射文件——它们比命名的管道/IPC快吗?

答案是,像往常一样,“这取决于”。如果涉及到大量数据,共享内存将大大减少复制数据的开销。但是以这种方式使用映射文件仍然需要一些附加形式的IPC来协调对共享内存空间的访问。

IPC作为一个概念并不局限于一台机器,因此我不理解“我认为命名管道是严格为IPC命名的”这是一个好观点。我想我的意思是,我认为命名管道严格来说是为了在同一台机器上跨不同进程/应用程序域进行通信。哦,我明白了,所以本质上你仍然需要一个管道来协调内存映射文件的使用方式,在某些情况下,单独使用管道会更快吗?有趣。我想在我的情况下,内存映射文件是有意义的。只是为了证实/否认我的怀疑。管道是否严格用于同一台机器上的IPC,或者它们也可以通过网络使用?不,不需要管道来协调。您可以为标志和其他控制数据保留MMF的一个区域。当然,您必须小心同步。您也可以使用ManualResetEvent或其他信号事件进行同步。(管道可以通过网络使用)是的,这基本上是正确的;尽管管道之外还有其他机制可以用于协调。例如,System V消息队列或Mach IPC端口。