我正在处理使用Web Workers处理所有AJAX请求的代码(如果可用)。这些工作人员几乎只做XMLHttpRequest
对象处理(没有额外的计算)。工作人员创建的所有请求都是异步的(request.open("get",url,true)
)。
最近,我遇到了有关此代码的几个问题,我开始怀疑是否应该花时间修复此问题或者只是转储整个解决方案。
到目前为止,我的研究表明,此代码实际上可能会损害性能。但是,我无法找到支持这一点的任何可信来源。我唯一的两个发现是:
有人能指出我讨论这个问题的可靠来源吗?或者,是否有任何基准可以消除我的疑虑?
[编辑]当WebWorker还负责解析结果(JSON.parse
)时,这个问题会变得更有趣。异步解析是否提高了性能?
答案 0 :(得分:25)
我创建了一个proper benchmark for that on jsperf。根据浏览器的不同, WebWorker方法比原始ajax调用慢85-95%。
注意:
new XMLHttpRequest()
和JSON.parse(jsonString);
。没有真正的 AJAX调用。答案 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的。一些例子:
编辑:另一个好的读物是:Opinion about synchronous requests in web workers