我正在创建一个Firefox扩展,允许在Firefox中使用Standard ML(SML)作为客户端编程语言。它的工作方式如下:
以下是DOM库的实现方式:
我的问题是,从理论上讲,当谈到套接字通信时,我应该期待在性能方面有什么限制?
我做了一些非常近似的分析,似乎在扩展和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)
答案 0 :(得分:1)
可以调整TCP以获得更高的吞吐量或更快的响应时间。要获得更高的吞吐量,需要将套接字缓冲区设置为更大的值。要获得较小的数据块的良好响应时间,您需要设置TCP_NODELAY套接字选项。 TCP on loopback如果经过微调,它应该与任何IPC机制相同。较新的Windows操作系统会进行特殊优化,例如在环回适配器上增加MTU大小等,以使其更快。