提高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)

相关文章
|
存储 数据采集 固态存储
带三维重建和还原功能的医学影像管理系统(pacs)源码
带三维重建和还原功能的医学影像管理系统(pacs)源码
252 0
|
4天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
15天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1310 5
|
2天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
14天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1349 87
|
2天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
3天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
190 82
2025年阿里云域名备案流程(新手图文详细流程)