Web Workers处理AJAX调用 - 优化过度杀伤?

时间:2013-09-12 15:29:51

标签: javascript ajax asynchronous web-worker

我正在处理使用Web Workers处理所有AJAX请求的代码(如果可用)。这些工作人员几乎只做XMLHttpRequest对象处理(没有额外的计算)。工作人员创建的所有请求都是异步的(request.open("get",url,true))。

最近,我遇到了有关此代码的几个问题,我开始怀疑是否应该花时间修复此问题或者只是转储整个解决方案。

到目前为止,我的研究表明,此代码实际上可能会损害性能。但是,我无法找到支持这一点的任何可信来源。我唯一的两个发现是:

  • 2岁jQuery feature suggestion使用网络工作者进行AJAX通话
  • this所以似乎问了一些有点不同的问题(在web worker和AJAX调用中使用同步请求)

有人能指出我讨论这个问题的可靠来源吗?或者,是否有任何基准可以消除我的疑虑?

[编辑]当WebWorker还负责解析结果(JSON.parse)时,这个问题会变得更有趣。异步解析是否提高了性能?

5 个答案:

答案 0 :(得分:25)

我创建了一个proper benchmark for that on jsperf。根据浏览器的不同, WebWorker方法比原始ajax调用慢85-95%


注意:

  • 由于每个请求的网络响应时间可能不同,因此我只测试new XMLHttpRequest()JSON.parse(jsonString);。没有真正的 AJAX调用。
  • WebWorker设置和拆卸操作正在测量
  • 请注意我正在测试单个请求,对于多个同时请求,webworker方法的结果可能更好
  • Calvin Metcalf向我解释说,比较jsperf上的sync和async不会给出准确的结果,他创建了another benchmark来消除异步开销。结果仍然显示WebWorker方法明显变慢。
  • Reddit discussion我了解到主页和WebWorker之间传递的数据被复制,并且必须在此过程中被序列化。因此,使用WebWorker进行解析没有多大意义,无论如何都必须先对数据进行序列化和反序列化,然后才能在主页面上使用它们。

答案 1 :(得分:15)

首先要记住的是,网络工作者在花费更少时间的意义上很少做得更快,他们在将计算加载到后台线程的意义上使事情变得更快,从而不会阻止与用户交互相关的处理。例如,当您考虑传输数据时,进行大量计算可能需要8秒而不是4秒。但如果在主线程上完成,则整个页面将被冻结4秒,这可能是不可接受的。

考虑到这一点,只需将ajax调用关闭主线程就不会获得任何东西,因为ajax调用是非阻塞的。但是,如果您必须解析JSON甚至更好,从大型请求中提取一个小子集,那么Web工作者可以帮助您。

我听到但未确认的警告是,工作人员使用与主页面不同的缓存,因此如果在主线程和工作人员中加载相同的资源,则可能导致大量重复工作。

答案 2 :(得分:5)

您正在错误的位置优化代码。

AJAX请求已在单独的线程中运行,并在它们满足后返回主事件循环(并调用定义的回调函数)。

Web worker是线程的接口,用于计算成本高昂的操作。就像在经典的桌面应用程序中一样,当你不想用很长时间的计算来阻止界面时。

答案 3 :(得分:3)

异步IO是Javascript的一个重要概念。

首先,您的请求已经异步,IO是非阻塞的,在您的请求期间,您可以运行任何其他Javascript代码。在worker中执行回调比请求更有趣。

其次,Javascript引擎在同一个线程中执行所有代码 ,如果您创建新线程,则需要处理与worker message api的数据通信(请参阅Semaphore)。

总之,JavaScript的异步和单线程特性是强大的,尽可能多地使用它,并且只有在你真正需要它时才创建工作者,例如在一个很长的Javascript过程中。

答案 4 :(得分:1)

根据我的经验,Web Workers 不应该用于AJAX调用。首先,它们是异步的,这意味着在您等待信息返回时代码仍会运行。

现在,使用worker来处理响应肯定是你可以使用Web Worker的。一些例子:

  • 解析响应以构建大型模型
  • 从响应中计算大量数据
  • 将带有模板引擎的共享Web工作者与AJAX响应结合使用,以构建HTML,然后将其返回以附加到DOM。

编辑:另一个好的读物是:Opinion about synchronous requests in web workers