5

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

  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;

JavaScript 显然具有更好的性能,我想你可以在这 0.05 秒内调用数千(数百)次 Canvas/DOM 函数来绘制框架。

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

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

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

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

4

1 回答 1

1

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

于 2014-06-07T05:55:44.770 回答