使用套接字进行进程间通信的限制是什么?

时间:2010-11-26 17:38:45

标签: sockets firefox firefox-addon sml interprocess

我正在创建一个Firefox扩展,允许在Firefox中使用Standard ML(SML)作为客户端编程语言。它的工作方式如下:

  1. 扩展程序启动PolyML进程(具有顶级交互式shell的SML编译器)。
  2. 然后在扩展和PolyML过程之间建立套接字通信。
  3. 从网页读取SML代码,并通过套接字发送到PolyML流程进行评估。
  4. 然后,该代码可以使用我提供的库来处理DOM。
  5. 以下是DOM库的实现方式:

    1. 假设有人执行SML函数DOM.getElementById
    2. 此请求通过套接字转发到扩展,扩展在页面上执行JavaScript函数getElementById,并通过套接字将结果发送回PolyML进程。
    3. 我的问题是,从理论上讲,当谈到套接字通信时,我应该期待在性能方面有什么限制?

      我做了一些非常近似的分析,似乎在扩展和PolyML之间使用此接口,我可以大致发送 2500条消息/秒,平均大小为 70字节/消息

      在更多上下文中,我想在浏览器中使用Canvas元素绘制一些动画。如果我想达到20fps,这意味着我需要在0.05秒内绘制每一帧,这意味着我每帧只能发送大约125条消息。这些消息对应于JavaScript函数调用。例如,下面的代码绘制一个路径,并进行9次JavaScript函数调用,对应于套接字通信中的9条消息。

      val _ = Canvas.beginPath context;
      val _ = Canvas.setFillStyle context fillColor;
      val _ = Canvas.setStrokeStyle context fillColor;
      val _ = Canvas.setLineWidth context size;
      val _ = Canvas.moveTo context posx posy;
      val _ = Canvas.lineTo context posx_new posy_new;
      val _ = Canvas.stroke context;
      val _ = Canvas.arc context posx_new posy_new (size/2.0) 0.0 6.28 true;
      val _ = Canvas.fill context;
      

      显然,JavaScript的性能要好得多,我想你可以在0.05秒内完成数千(数百)次Canvas / DOM函数调用,以便绘制一个框架。

      所以,我想我的问题是,您是否有使用套接字通信进行快速消息交换的经验。我想知道2500条小信息/秒(在这种情况下,相当于150千字节/秒)是否正确或者我可能做错了什么。

      例如,有人怀疑firefox中的套接字实现(特别是通过JavaScript接口https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIServerSocket使用它)对于这种快速交互并不是很好。例如,从套接字读取是通过事件循环机制完成的。那就是我依靠Firefox ..来通知我有关传入套接字消息的可用性,有时在发送消息和接收它之间有一个很大的(例如250ms)延迟(虽然这似乎只有在firefox忙于做的时候才会发生其他的事情,我对套接字通信的理论限制更感兴趣

      你看到的任何想法,想法,任何缺陷?您认为使用其他IPC机制会更好吗,例如管道,实现我从C ++ XPCOM组件的通信,而不是从JavaScript,外部函数接口到C(JavaScript和PolyML都有)?

      (如果有人有兴趣,该项目位于https://assembla.com/wiki/show/polymlext

1 个答案:

答案 0 :(得分:1)

可以调整TCP以获得更高的吞吐量或更快的响应时间。要获得更高的吞吐量,需要将套接字缓冲区设置为更大的值。要获得较小的数据块的良好响应时间,您需要设置TCP_NODELAY套接字选项。 TCP on loopback如果经过微调,它应该与任何IPC机制相同。较新的Windows操作系统会进行特殊优化,例如在环回适配器上增加MTU大小等,以使其更快。