我正在创建一个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字节。
(如果有人感兴趣,该项目位于https://assembla.com/wiki/show/polymlext)
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函数调用,以绘制一帧。
所以,我的问题是,您是否有使用socket通信进行非常快速的消息交换的经验。我想知道每秒2500个小消息(在这种情况下,相当于150 kbytes /秒)是否合适,或者我可能做错了什么。
例如,有一个怀疑是Firefox中的socket实现(特别是通过JavaScript接口https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIServerSocket使用它)对于这种快速交互不是很好。例如,从socket读取是通过事件循环机制完成的。也就是说,我依赖Firefox..来通知我有关传入socket消息的可用性,有时在发送消息和接收消息之间存在较大的延迟(例如250毫秒),尽管这似乎只发生在Firefox正在忙于其他事情时,并且我更感兴趣的是..socket通信的理论极限。
任何想法,任何想法,任何缺陷您看到了吗?您认为使用其他IPC机制会更好,例如管道,从C ++ XPCOM组件实现我的通信,而不是从JavaScript,外部函数接口到C(JavaScript和PolyML都有)?(如果有人感兴趣,该项目位于https://assembla.com/wiki/show/polymlext)