【问题标题】:Communication between applications应用程序之间的通信
【发布时间】:2011-07-08 01:47:25
【问题描述】:

我有 3 种选择可以使用:sockets、activeX、com,以便在一台计算机上的应用程序之间进行通信。哪个更快?

【问题讨论】:

  • -1:哪个更快类型的问题可以总是通过尝试得到答案。除此之外,如果没有关于您的具体问题的更多详细信息,任何答案都只是猜测。
  • 对于大量数据,可能套接字会更快。为什么不测试一下?
  • 不同意 space_cowboy:为他的案例实施所有三个选项以获得真实数据的有用实验肯定需要 10 多个小时的开发时间。在这种情况下,向社区询问他们对这些方法的体验是适当的。
  • 您有更多选择:管道、Windows 消息 (WM_COPYDATA)、同步对象...是否有理由限制您使用列出的那些?更重要的是:你用它做什么?显然,不同的 IPC 方法存在是有原因的,问题绝不是简单的“一个比另一个快”。您的具体情况将决定。如果通过“沟通”你的意思是触发一个事件,那么 Windows 消息可能是最快的。请澄清
  • 我需要与第 3 方产品通信。他们只提供列出的一种。通信是指传输数据

标签: c++ windows sockets com activex


【解决方案1】:

只要它在一台机器上运行,进程间通信就会从根本上受到总线带宽的限制。内存到内存的复制,无论是在 TCP/IP 堆栈、命名管道支持代码还是共享内存中完成。这使得它们都同样高效。

不过,有一个细节很重要,即传输的数据量以及完成工作所经过的软件层数。内存总线带宽仅在数据量很大时才会节流。对于像 COM 这样的远程过程调用协议,情况不一定如此。只有函数调用的参数需要序列化,如果你不传递数组,那可能只有几个字节。现在开销开始变得很重要,当您使用像 COM 这样的高级协议时,开销会相当大。

使用套接字的明显缺点是您必须自己编写所有反序列化代码。如果与组件的协议不简单,则非平凡。为方便而牺牲工作时间是典型的选择,只有你能做到。

【讨论】:

    【解决方案2】:

    好吧,想想看——socket 是最底层的,COM 使用的是 socket,ActiveX 使用的是 COM。那么哪个更快呢?当然,插座。但这只是在您询问程序执行速度和数据传输率时。但是,如果您不知道自己在做什么,那么使用套接字开发程序可能会更加困难。更不用说你可能会想出一些比 COM 更糟糕的实现。此外,在使用 ActiveX 时,您可以获得的用于套接字的可重用组件并不多,更不用说如果您想与 MS Office 通信,则必须使用 COM。

    【讨论】:

    • 其实COM在跨进程中使用LRPC/LPC(不是sockets),但机器情况相同。 LRPC/LPC 非常高效(使用共享内存)。
    • @Steve:同一台机器上的套接字也在使用 IPC。虽然共享内存无法通过网络工作(有一些解决方案,但价格昂贵,效率和可靠性不高)。
    【解决方案3】:

    您没有详细说明您正在尝试做什么或需要考虑什么。例如,“快速”是指高带宽吗?低延迟?您以后可能需要跨计算机进行通信吗?等等。

    也就是说,ActiveX 是 COM (introduction to activeX) 的一个特例。如果您已经熟悉 COM 或 ActiveX,并且取决于您究竟想要做什么,您可能能够避免编写相对较少的代码,因为 MS 开发工具可以为您处理很多代码。

    不过,如果您不熟悉它,它是一项相当复杂的技术,您可能难以理解。因此,如果您只是尝试实现一些基本的进程间通信,那么使用套接字可能更容易。另一方面,这可能需要您进行更多的低级工作。

    【讨论】:

      【解决方案4】:

      我还将 IPC 委托给一个框架,例如ACE(自适应通信框架)。 例如,Ace 的实现是稳定的并且是跨平台的。

      【讨论】:

        【解决方案5】:

        ActiveX 在 COM 上或多或少是一个花哨的营销名称(ActiveX 组件/控件是仅支持 IUnknown 接口的对象),因此您的选择实际上取决于 COM 与 Socket。

        对于跨进程通信,您可以使用套接字更快地编写一些东西...如果您是一个优秀的套接字和 Windows 程序员,因为您将独自一人,因为套接字基本上什么都不做来帮你。这并不意味着 COM 不快或性能不佳,但理论上你总是可以比开箱即用的系统做得更好,但前提是你掌握了全部。

        最后,如果您需要与 3rd 方产品或 Windows 以外的其他平台进行通信,Sockets 更便携。

        【讨论】:

          【解决方案6】:

          实际上哪个更快可能并不重要。如果是这样,请选择最方便开发和维护的方法。即使您无法节省任何可衡量的运行时间,也可以节省您自己的时间。

          【讨论】:

          • 我们中的一些人以做得最好而自豪。
          • @Jay 选择最方便和可维护的方法通常可以让您做得最好。我想您不会用机器代码编写所有程序!
          • @Jay 另请注意哪个答案已被接受——那个答案与我的基本相同!
          【解决方案7】:

          很难说哪个更快,但使用 COM 肯定是您列出的选择中最灵活的。除非你喜欢在字节流中卑躬屈膝。

          【讨论】:

            猜你喜欢
            • 2011-10-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-11
            • 1970-01-01
            相关资源
            最近更新 更多