Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 使用套接字进行进程间通信有哪些限制?_Sockets_Firefox_Firefox Addon_Sml_Interprocess - Fatal编程技术网

Sockets 使用套接字进行进程间通信有哪些限制?

Sockets 使用套接字进行进程间通信有哪些限制?,sockets,firefox,firefox-addon,sml,interprocess,Sockets,Firefox,Firefox Addon,Sml,Interprocess,我正在创建一个Firefox扩展,它允许在Firefox中使用标准ML(SML)作为客户端编程语言。其工作方式如下: 该扩展启动一个PolyML进程(带有顶级交互式shell的SML编译器) 然后在扩展和PolyML进程之间建立套接字通信 SML代码从网页中读取,并通过套接字发送到PolyML流程进行评估 然后,这些代码可能会使用我提供的库来处理DOM 下面是DOM库的实现方式: 假设有人执行SML函数DOM.getElementById 此请求通过套接字转发到扩展,扩展在扩展中执行页面上的Ja

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

  • 该扩展启动一个PolyML进程(带有顶级交互式shell的SML编译器)
  • 然后在扩展和PolyML进程之间建立套接字通信
  • SML代码从网页中读取,并通过套接字发送到PolyML流程进行评估
  • 然后,这些代码可能会使用我提供的库来处理DOM
  • 下面是DOM库的实现方式:

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

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

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

    很明显,JavaScript的性能要好得多,我可以想象,在这0.05秒内,您可以进行数千(数百)次的Canvas/DOM函数调用来绘制一个帧

    所以,我想我的问题是,您是否有使用套接字通信进行快速消息交换的经验。我想知道每秒2500条小消息(在本例中,相当于每秒150千字节)似乎是正确的,还是我做了一些非常错误的事情

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

    你有什么想法,想法,缺点吗?您认为使用其他IPC机制会更好吗?例如管道,实现从C++ XPCCOM组件的通信,而不是从JavaScript、异能函数接口到C(JavaScript和MulpML都有)?
    (如果有人感兴趣,项目位于)

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

    您使用TCP吗?UDP?还是UNIX套接字?后者应该更快,因为操作系统不必关心网络错误。你知道这些是TCP、UNIX还是可配置的吗?我还意识到瓶颈可能是JSON编码/解码,尽管我已经记不清其中有多少被使用了。如果我正确理解源代码,nsIServerSocket总是使用AF_INET,即使是用于本地连接。给出了两种方法之间的比较:对于AF_UNIX,在80.575200秒内传输100GB;对于AF_INET+环回,在226.717520秒内传输100GB。IHMO,TCP速度足够快,可以跨平台工作。Windows AFAIK上没有UNIX套接字。您最大的问题将是数据序列化。
    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;