使用HTML5 Web Worker提高Web的应用性能研究.docx

上传人:b****4 文档编号:24473703 上传时间:2023-05-27 格式:DOCX 页数:8 大小:18.54KB
下载 相关 举报
使用HTML5 Web Worker提高Web的应用性能研究.docx_第1页
第1页 / 共8页
使用HTML5 Web Worker提高Web的应用性能研究.docx_第2页
第2页 / 共8页
使用HTML5 Web Worker提高Web的应用性能研究.docx_第3页
第3页 / 共8页
使用HTML5 Web Worker提高Web的应用性能研究.docx_第4页
第4页 / 共8页
使用HTML5 Web Worker提高Web的应用性能研究.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

使用HTML5 Web Worker提高Web的应用性能研究.docx

《使用HTML5 Web Worker提高Web的应用性能研究.docx》由会员分享,可在线阅读,更多相关《使用HTML5 Web Worker提高Web的应用性能研究.docx(8页珍藏版)》请在冰豆网上搜索。

使用HTML5 Web Worker提高Web的应用性能研究.docx

使用HTML5WebWorker提高Web的应用性能研究

使用HTML5WebWorker提高Web的应用性能研究

摘要:

JavaScript传统上是单线程的,在HTML页面中执行一个需较长时间运行的脚本会阻塞所有的页面功能直至脚本完成。

WebWorker是HTML5提供的JavaScript多线程解决方案。

解析了WebWorker的工作原理和过程;提供了WebWorker代码示例和代码调试方法;说明了使用WebWorker如何提高Web应用的性能。

由于WebWorker相对较新,目前关于WebWorker的示例和文献非常有限。

该研究院提供了WebWorker的参考应用场景及进一步研究和应用的方向。

  关键词:

HTML5;WebWorker;JavaScript;多线程

  1HTML5WebWorker背景介绍

  WebWorker无疑是最新版Web浏览器最酷最炫的特征。

WebWorkers是HTML5提供的一个JavaScript多线程解决方案。

使用WebWorker允许在网页上并发运行多个JavaScript脚本而不会阻塞用户界面。

  从2008年W3C制定出第一个HTML5草案开始,HTML5承载了越来越多崭新的特性和功能。

它不但强化了Web系统或网页的表现性能,而且还增加了对本地数据库等Web应用功能的支持,其中,最重要的一个便是对多线程的支持。

在HTML5中提出了工作线程(WebWorker)的概念,并且规范出WebWorker的三大主要特征:

能够长时间运行(响应)、理想的启动性能以及理想的内存消耗。

WebWorker允许开发人员编写能够长时间运行而不被用户所中断的后台程序,去执行事务或者逻辑,并同时保证页面对用户的及时响应[1]。

  在WebWorker出现之前,JavaScript是现代Web应用程序的核心。

JavaScript和DOM核心上是单线程的,这意味者在任何时候都只能执行一个JavaScript方法,当在HTML页面中执行一个需较长时间运行的脚本会阻塞所有的页面功能直至脚本完成。

页面UI元素是不可响应的,动画会停顿,应用中的其它代码都不能执行。

当需要使用JavaScript进行较大量的计算时,需要将任务分成小的代码块,使用timer来分离各个代码块的执行,这样执行的速度会变慢。

而有了WebWorker,就可以将一些大计算量的代码交由WebWorker运行而不冻结用户界面。

  WebWorker独立于浏览器UI线程,是在后台装载和运行的JavaScript脚本,独立于其它脚本,不会影响页面的性能。

用户可以做任何愿意做的事情:

点击、选取内容等等,而此时WebWorker在后台运行[2],这样就可以同时执行多个JS任务而不会阻塞浏览器。

WebWorker适合的领域包括:

异步交互、大规模计算如编码、解码大字符串、复杂数学运算以及大数组排序;后台服务器交互以及后台下载等。

WebWorker极大地提升了用户体验。

  WebWorker打破了传统JavaScript的单线程模式,引入了多线程编程模式。

一个Worker是一个独立的线程,有多个任务需要处理的Web应用程序不再需要逐个处理任务,反之,应用程序可以将任务分配给不同的Worker。

  由于WebWorker相对较新,目前关于WebWorker的示例和文献非常有限,本文所引用文献直接来自Microsoft和W3school技术支持网站。

  2WebWorker和AJAX比较

  解决以上JavaScript单线程问题,推荐的方法是采用JavaScript异步编程模式(AJAX-AsynchronousJavaScriptAndXML)。

关于更多JavaScript异步编程模式请参见文献[3]。

  尽管异步编程能够解决某些JavaScript单线程问题,但其性能仍然还有缺陷。

另外,应用程序在某些应用场景中,可能需要持续的计算、监控或者后台的处理,这些也是AJAX无法做到的,而WebWorker的引入能够解决上述问题。

WebWorker允许应用程序按照需要启动新的独立线程。

  3浏览器支持

  目前主流的浏览器新版本都支持WebWorker。

  FireFox:

3.5+

  Safair:

4+

  Chrome3+

  Opera:

10+

  InternetExplorer以前的版本不支持,版本10和使用JavaScript的Windows应用商店引入了对WebWorker的支持[4]。

另外苹果的iOS5也增加了WebWorker的支持。

  4WebWorker工作原理与过程

  WebWorker允许web应用根据需要创建另外的线程。

WebWorker的基本原理就是在当前JavaScript的主线程中,使用Worker类加载一个JavaScript文件来开辟一个新的线程,起到互不阻塞执行的效果,并且提供主线程和新线程之间数据交换的接口:

postMessage,onmessage。

  需要注意的是,尽管WebWorkers能实现多线程,但它们之间以及与主线程之间并不使用共享数据,这样使得编程模型更加简单。

在Worker和主线程之间的通信是通过消息传递完成的。

Workers是相对重量级的线程,需要相当的时间来启动,其取决于应用的要求,可以在应用本身初始化的时候实例化Worker并持续使用Worker,而不是每次使用的时候实例化然后关闭。

需要注意的是WebWorkers对DOM没有访问权限。

它们可以访问标准JavaScript函数库以及少量像XHR、location和navigator这样的API。

  使用WebWorker主要分为以下几部分:

  

(1)Web主线程。

  ①通过Worker=newWorker(url)加载一个JS文件来创建一个Worker,同时返回一个Worker实例;

  ②通过Worker.postMessage(data)方法来向Worker发送数据,并启动Worker;

  ③绑定Worker.onmessage方法来接收从Worker发送过来的数据;

  ④可以使用Worker.terminate()来终止一个Worker的执行。

  

(2)Worker工作线程。

  ①通过postMessage(data)方法来向主线程发送数据;

  ②绑定onmessage方法来接收主线程发送过来的数据。

  另外,可以在Worker线程中通过importScripts(url)加载另外的脚本文件,使得WebWorker功能更加强大。

  5WebWorker实例代码以及代码调试

  5.1完整的WebWorker代码示例

  myWorker.js

  //JavaScript文件

  onmessage=function(event)

  {

  //receivethedatasentbythemainpagethroughevent.data

  vard=event.data;

  //sendthereceiveddataplus“fromworker“backtothemainpage

  postMessage(d+"fromworker!

");

  }

  HTML页面:

HTMLPage.htm

  

//www.w3.org/1999/xhtml">

  

  MyFirstWebPageUsingWebWorker

  

  

  Startworker

  

  functionstartWorker(){

  try{

  //createanewworker

  varmyWorker=newWorker("myWorker.js");

  //sendamessagetostarttheworker

  varinfo="HelloWorld";

  myWorker.postMessage(info);

  //receiveamessagefromtheworker

  myWorker.onmessage=function(event){

  //dosomethingwhenreceivingamessagefromworker

  alert(event.data);

  }

  }

  catch(ex){

  alert(ex);

  }

  }

  

  var_userid='zju0@';var_siteid=369;var_istoken=1;var_model='Model03';WebPageSpeed=156;UrchinTrack();

  

  本例源代码在VisualStudio中通过“新建网站”的方式生成并发布。

要注意的是WebWorker不支持跨域js加载,因此在生成代码时,WebWorkerjs文件需要与主web页在一个域内。

注意运行时使用GoogleChrome浏览器打开HTMLPage.htm后,会出现一个“Startworker”的按钮,点击按钮,会弹出“HelloWorldfromworker!

”的对话框,表示程序执行成功,如图1所示。

  5.2WebWorker代码调试

  由于WebWorker线程是无法操作DOM的,所以不可以采用alert/console等输出信息,并且目前大多数浏览器(目前Chrome已支持)还无法提供类似常规js脚本调试的工具来调试WebWorker线程的js文件。

  对于不支持WebWorkerjs脚本调试的浏览器可以将worker线程的调试请求发送到主线程,主线程通过接收worker线程发送的日志输出请求打印log。

对“5.1”中的代码示例添加调试代码后的实现代码如下:

  //myWorker.js

  //JavaScript文件

  onmessage=function(event)

  {

  if(event.data.type=="start"){

  process(event.data.value);

  }

  };

  functionprocess(astring){self.postMessage({

  type:

"debug",

  message:

"Startingprocessing..."

  });

  //sendthereceiveddataplus“fromworker“backtothemainpage

  postMessage(astring+"fromworker!

");

  self.postMessage({

  type:

"debug",

  message:

"Processingfinished"

  });

  }

  HTML页面:

HTMLPage.htm

  

//www.w3.org/1999/xhtml">

  

  无标题页

  

  

  Startworker

  

  functionstartWorker(){

  try{

  //createanewworker

  varmyWorker=newWorker("myWorker.js");

  //sendamessagetostarttheworker

  myWorker.postMessage({

  type:

"start",

  value:

"HelloWorld"

  });

  //receiveamessagefromtheworker

  myWorker.onmessage=function(event){

  case"debug":

//通过控制台输出来自WebWorker的调试信息

  console.log(event.data.message);

  break;

  default:

//通过消息对话框显示来自WebWorker的返回数据

  alert(event.data);

  }

  }

  catch(ex){

  alert(ex);

  }

  }

  

  var_userid='zju0@';var_siteid=369;var_istoken=1;var_model='Model03';WebPageSpeed=203;UrchinTrack();

  

  目前Chrome浏览器的debug工具已经支持调试WebWorker线程中的代码。

具体操作方法,就是在script对应的tab页的右下角勾选Worker的调试选项,如图2所示。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 水产渔业

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1