Kon*_*nel 41 javascript ajax asynchronous web-worker
我正在使用一个代码来处理使用Web Workers的所有AJAX请求(如果可用).这些工作人员几乎只做XMLHttpRequest
对象处理(没有额外的计算).工作人员创建的所有请求都是异步的(request.open("get",url,true)
).
最近,我遇到了关于这段代码的几个问题,我开始怀疑是否应该花时间修复这个或者只是转储整个解决方案.
到目前为止,我的研究表明,此代码实际上可能会损害性能.但是,我无法找到支持这一点的任何可信来源.我的两个发现是:
有人能指出我讨论这个问题的可靠来源吗?或者,是否有任何基准可以消除我的疑虑?
[ 编辑 ]当WebWorker也负责解析结果(JSON.parse
)时,这个问题会变得更有趣.异步解析是否提高了性能?
Kon*_*nel 25
我已经在jsperf上为它创建了一个合适的基准.根据浏览器的不同,WebWorker方法比原始ajax调用慢85-95%.
笔记:
new XMLHttpRequest()
和JSON.parse(jsonString);
.没有真正的 AJAX调用.Cal*_*vin 15
首先要记住的是,Web工作者在花费较少时间的意义上很少使事情变得更快,他们在将计算加载到后台线程的意义上使事情变得更快,从而不会阻止与用户交互相关的处理.例如,当您考虑传输数据时,进行大量计算可能需要8秒而不是4秒.但如果在主线程上完成,整个页面将被冻结4秒,这可能是不可接受的.
考虑到这一点,只需ajax调用关闭主线程就不会获得任何东西,因为ajax调用是非阻塞的.但是,如果您必须解析JSON甚至更好,从大型请求中提取一个小子集,那么Web工作者可以帮助您.
我听到但未确认的一个警告是,工作人员使用与主页面不同的缓存,因此如果在主线程和工作程序中加载相同的资源,则可能导致大量重复工作.
您正在错误的位置优化代码.
AJAX请求已经在一个单独的线程中运行,并在它们满足后返回主事件循环(并调用定义的回调函数).
Web worker是线程的接口,用于计算成本高昂的操作.就像在经典桌面应用程序中一样,当您不想使用需要很长时间的计算来阻止界面时.