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

Kar*_*lis 5 sockets firefox sml firefox-addon interprocess

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

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

以下是DOM库的实现方式:

  1. 假设有人执行SML函数DOM.getElementById
  2. 此请求通过套接字转发到扩展,扩展在页面上执行JavaScript函数getElementById,并通过套接字将结果发送回PolyML进程.

我的问题是,理论上,在套接字通信方面,我应该期待在性能方面有什么限制?

我做了一些非常近似的分析,似乎在扩展和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;
Run Code Online (Sandbox Code Playgroud)

显然,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

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