提高ipad浏览器下大尺寸xml文件解析的性能

简介:

昨天,客户报了个Bug过来:html5应用在ipad下卡住不动了。按照他发过来的地址,初步诊断是xml解析的性能问题。应用初始化时要加载几个xml配置文件,客户给的地址中,一个配置文件有800多K(文件A),另一个配置文件有400多K(文件B)。我修改了程序,在PC机上用Safari模拟ipad登录,解析文件A花了30多秒。一般来说,ipad2的性能是我的PC机的1/5,在ipad上解析这个xml文件至少要花150秒。这是不能接受的。同样的程序,在ie下测试,仅仅耗时160ms!我用的是haXe的xml库,在ie9和在safari上竟然有这么大的性能差距。

又找了几个xml库,不是无法运行,就是执行失败。实在没有办法,只好用domparser来解析,当html文件处理。使用domparser可以极大的提高性能,还是以文件A为例子,在PC的safari上解析耗时降为1秒左右,这个时间是可以承受的。然而,使用domparser存在一个问题,就是无法提取出CData数据。http://stackoverflow.com/questions/5227592/extract-cdata-from-rss-xml-using-javascript 给出了一个解决方案:将CData数据用标签围住,这是一种思路。于是,修改程序,将<![CDATA[替换为<cdata>,将]]>替换成</cdata>。

提取cdata标签的数据,当作XML文件的CData数据/。问题似乎解决了,经过多次测试,又发现了新的问题:

CData中有很多字符没有转义。在CData中倒是无害,但在<cdata></cdata>中就变成有害了。这里又要表扬下ie9:ie9在这种情况下能够正确解析,Safari不能!

既然问题出现在CData,那么我们就对CData数据进行预处理:
(1),找到每个CData数据,为它编号;
(2),对每个CData片段,用它的编号进行替换,这样就屏蔽了敏感字符;
(3),将替换后的文本,用domparser解析。

这样一来,当使用这个Dom时,碰到CData编号,再将它替换为对应的CData数据即可。因为文件A在ipad上无法解析成功,这里只对文件B的解析进行了都比。之前解析文件B耗时是13-16秒,使用新方法后,解析时间缩短为32毫秒,提高了约400倍。

====

下面的代码是用haXe写的,haXe很容易读,就不详加解释了。
CData类,存储键值对:

复制代码
class CData 
{
  public  var key:String;
 
  public  var val:String;
 
  public function  new() 
 {
 } 
}
复制代码

Xml2Html类,对xml文本进行预处理,并存储CData信息:

复制代码
class Xml2Html 
{
  private  var map:Array<CData>;

  public function  new() 
 {
 }
 
  public function getCData(key:String):String
 {
   if (map ==  nullreturn  null;
  
   for (i  in  0 ... map.length)
  {
    var item:CData = map[i];
    if (item.key == key)
   {
     return item.val;
   }
  }
  
   return  null;
 }
 
  public function prepareXmlAsHtml(txt:String):String
 {
  map =  new Array<CData>();
  txt = StringTools.replace(txt,  " <![CDATA[ "" ]]> ");
   var lines:Array<String> = txt.split( " ]]> ");
   if (lines.length ==  0return txt;
   var buff:StringBuf =  new StringBuf();
   var k:Int =  0;
   for (i  in  0 ... lines.length)
  {
    var val:String = lines[i];
    if (i %  2 ==  0//  正常内容
   {
    buff.add(val);
   }
    else
   {
     var key:String = Std. string(k);
    buff.add( " <cdata> " + key +  " </cdata> ");
     var cdata:CData =  new CData();
    cdata.key = key;
    cdata.val = val;
    map.push(cdata);
    k++;
   }
  }
  
   return buff.toString();
 }
}
复制代码

下面是解析示例:

复制代码
   var ctx:Xml2Html =  new Xml2Html();
  searchInfo = dom.parseFromString(ctx.prepareXmlAsHtml(data),  " text/xml ");
    
   var dom:HtmlDom = searchInfo;
   var pages:HtmlCollection<HtmlDom> = dom.getElementsByTagName( " page ");
   for (i  in  0 ... pages.length)
  {
    var node:HtmlDom = pages[i];
    var pageNumVal:String = node.getAttribute( " pageNumber ");
    var htmlText:String =  null;
    var htmlTextDoms:HtmlCollection<HtmlDom> = node.getElementsByTagName( " cdata ");
    if (htmlTextDoms !=  null && htmlTextDoms.length >  0)
   {
    htmlText = StringTools.trim(htmlTextDoms[ 0].childNodes[ 0].nodeValue);
    htmlText = ctx.getCData(htmlText);
   }
   
    for (k  in  0 ... book.pages.length)
   {
     var page:Page = book.pages[k];
     if (page.id == pageNumVal)
    {
     page.content = htmlText;
    }
   }
  }
复制代码

====

小结:

(1)IE9很厉害!

(2)haXe是好东东,用它写js程序很舒服。但因为是开源社区的作品,还不够成熟,需要使用者自己想办法来弥补其缺陷。

本文转自xiaotie博客园博客,原文链接http://www.cnblogs.com/xiaotie/archive/2012/02/23/2365453.html如需转载请自行联系原作者


xiaotie 集异璧实验室(GEBLAB)

相关文章
|
11月前
|
Web App开发 缓存 前端开发
浏览器常见面试题目及详细答案解析
本文围绕浏览器常见面试题及答案展开,深入解析浏览器组成、内核、渲染机制与缓存等核心知识点。内容涵盖浏览器的主要组成部分(如用户界面、呈现引擎、JavaScript解释器等)、主流浏览器内核及其特点、从输入URL到页面呈现的全过程,以及CSS加载对渲染的影响等。结合实际应用场景,帮助读者全面掌握浏览器工作原理,为前端开发和面试提供扎实的知识储备。
433 4
|
7月前
|
数据采集 人工智能 自然语言处理
Playwright MCP 浏览器自动化框架全面解析
Playwright MCP是微软推出的开源项目,结合Playwright与MCP协议,让AI通过结构化数据直接操作浏览器。告别传统视觉识别,实现高效、精准的网页自动化,广泛应用于测试、爬虫、办公自动化等场景,大幅提升效率与可靠性。
|
12月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
357 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
10月前
|
Web App开发 安全 测试技术
Playwright-MCP浏览器会话复用全解析
本文深入解析Playwright-MCP实现浏览器会话复用的核心技术,包括状态持久化(cookies/localStorage存储)和直接连接已打开浏览器实例(通过CDP协议)。通过多上下文隔离与安全机制设计,提供企业级应用场景的优化方案,帮助开发者提升测试效率并降低资源消耗。
|
缓存 监控 前端开发
在资源加载优化中,如何利用浏览器缓存提升性能?
通过以上这些方法,可以有效地利用浏览器缓存来提升资源加载的性能,减少网络请求次数,提高用户体验和应用的响应速度。同时,需要根据具体的应用场景和资源特点进行灵活调整和优化,以达到最佳的效果。此外,随着技术的不断发展和变化,还需要持续关注和学习新的缓存优化方法和策略。
667 159
|
数据采集 Web App开发 监控
深度解析:使用ChromeDriver和webdriver_manager实现无头浏览器爬虫
在现代网络爬虫实践中,动态网页加载和反爬虫机制增加了数据采集的难度。采用无头浏览器技术(如Selenium与ChromeDriver)可有效模拟用户行为、执行JavaScript,获取动态内容。通过设置代理IP、伪装User-Agent和处理Cookies,提升爬虫隐蔽性和稳定性。该方案适用于电商价格监控、社交媒体数据采集和招聘信息抓取等场景,实现更高效的数据获取。
1124 2
深度解析:使用ChromeDriver和webdriver_manager实现无头浏览器爬虫
|
JavaScript 前端开发 数据处理
模板字符串和普通字符串在浏览器和 Node.js 中的性能表现是否一致?
综上所述,模板字符串和普通字符串在浏览器和 Node.js 中的性能表现既有相似之处,也有不同之处。在实际应用中,需要根据具体的场景和性能需求来选择使用哪种字符串处理方式,以达到最佳的性能和开发效率。
427 63
|
缓存 监控 测试技术
如何利用浏览器的缓存来优化网站性能?
【10月更文挑战第23天】通过以上多种方法合理利用浏览器缓存,可以显著提高网站的性能,减少网络请求,加快资源加载速度,提升用户的访问体验。同时,要根据网站的具体情况和资源的特点,不断优化和调整缓存策略,以适应不断变化的业务需求和用户访问模式。
875 63
|
数据采集 Web App开发 存储
深度解析:使用 Headless 模式 ChromeDriver 进行无界面浏览器操作
本文介绍了基于无界面浏览器(如ChromeDriver)和代理IP技术的现代爬虫解决方案,以应对传统爬虫面临的反爬机制和动态加载内容等问题。通过Selenium驱动ChromeDriver,并结合亿牛云爬虫代理、自定义Cookie和User-Agent设置,实现高效的数据采集。代码示例展示了如何配置ChromeDriver、处理代理认证、添加Cookie及捕获异常,确保爬虫稳定运行。性能对比显示,Headless模式下的ChromeDriver在数据采集成功率、响应时间和反爬规避能力上显著优于传统爬虫。该方案广泛应用于电商、金融和新闻媒体等行业。
766 0
深度解析:使用 Headless 模式 ChromeDriver 进行无界面浏览器操作

热门文章

最新文章

相关课程

更多