原文链接:http://www.cnblogs.com/zouzf/p/4154569.html

最近在搞XML解析优化,公司引擎用了tinyxml1和tinyxml2两个XML库,后者的效率比前者高60%吧,tinyxml1解析大文件是很慢的,可以淘汰了,tinyxml2还勉强,快的话还得算pugixml或者rapidxml吧。

奈何一些引擎代码根深蒂固,无法更换为pugixml,只能局部修改一下tinyxml库的源代码企图优化一下

今天在优化的时候碰到一个坑,就是解析出错的时候,XML库是如何处理的,比如某个节点有两个同名的属性,以下是各XML库的处理:

tinyxml1:按XML文本的顺序解析,在解析到同名属性的时候,停止解析,返回已经解析好了的那部分,并且在document对象里的 errorLocation.row 和 errorLocation.col 表明出错的位置(行和列)

tinyxml2:貌似是递归解析,碰到同名属性时,一下子全蹦了,返回的document啥子都没有,在document对象里的 _errorStr1 里存储了那个同名的属性的名字, _errorStr2 指向那个同名属性后的位置。其实不是很好分辨

pugixml:非常高效,所以没看懂是如何解析的。在给element添加属性时应该是没有见检查是否存在同名属性,能正常解析完的,最后断点观察那两个同名属性都被加进了element的

解析比较:tinyxml1使用的是逐字符扫描,tinyxml2使用的划分成块解析吧,pugixml没看懂。除了解析的方式不同造成效率有差别之外,另外一个重要的原因则是字符串的操作了;还有一个就是冗余的安全性检查,效率和安全总是对立的。。

tinyxml1:区分是否使用了STL宏,如果使用了,里面的字符串都是使用sdt::string类型,否则就是用自定义的一个字符串类 tinystr。把XML文件读取到内存后,在解析的时候,每涉及到字符串操作时,比如设置属性的名字、属性等,都会有分配内存然后把字符串拷贝过来赋值(如果使用了STL则由STL::string负责内存的分配和管理) 。一个XML文件里有N多的节点、M的属性、非常多的字符串,每次都要分配内存、拷贝,慢是必然的了。每一次添加节点或者属性时,都会进行检查是否已有同名的节点或者属性。

tinyxml2:使用了自定义的字符串类 StrPair 。XML文件被读取到内存后,tinyxml2会分配内存(假设是A内存)把XML文件的内容拷贝过来,在解析的时候,涉及到XMLElement或者XMLAttribue等之外的name、value的时候,tinyxml2并没有再次分配内存把字符串拷贝过去,而是把strpair的 _start 指针 直接指向A内存里对应的位置,整个过程,只分配了一次内存~~ 解析完了之后,如果你添加了节点或者更改某属性的value等等时,tinyxml2则会分配新的内存,strpair类里有标记位来分辨是第一次解析还是后面的增加或者修改的。每一次添加节点或者属性时,都会进行检查是否已有同名的节点或者属性。

pugixml:貌似是自己负责了所有的内存管理,没太看懂~~每一次添加节点或者属性时,应该没有进行检查是否已有同名的节点或者属性~~

今天被坑在,某个XML文件某个节点有属性同名了,但引擎库是用了tinyxml1来解析的,所以返回的document的全半部分是正常的,而我是用tinyxml2来测试的优化代码的,发现~~~被坑大了,各种检查自己写的优化的代码~~~

刚好还发现那个XML文件里有中文,搞得又怀疑是编码的问题,顺便又恶补了一下编码的基础知识,顺便用了用比较了一下 sublime text、notepad++、UltraEdit~~~发现UltraEdit是用Unicode编码来显示的,对于黏贴进去的字符串会当成是Unicode编码格式下的来处理;sublime text 可以用utf8、大头小头Unicode-16、16进制等编码格式来显示,对于拷贝进去的字符串,会被当做是utf8编码格式下的来处理;notePad++ 可以用 ansi、utf8等编码格式来显示,对于拷贝进去的字符串,看你当前选择了什么格式,你选择了什么格式,拷贝进去的字符串就会当作那个编码格式下的来处理。

擦,都得又乱了,虽然原本也没清楚。。苦逼

原文链接:http://www.cnblogs.com/zouzf/p/4154569.html

tinyxml优化之一的更多相关文章

  1. tinyxml优化之二

    原文链接:http://www.cnblogs.com/zouzf/p/4216046.html tinyxml优化之一说到了效率在差别有三方面的原因:解析的方式.内存分配(字符串操作).冗余的安全性 ...

  2. 关于DOM的操作以及性能优化问题-重绘重排

     写在前面: 大家都知道DOM的操作很昂贵. 然后贵在什么地方呢? 一.访问DOM元素 二.修改DOM引起的重绘重排 一.访问DOM 像书上的比喻:把DOM和JavaScript(这里指ECMScri ...

  3. In-Memory:内存优化表的事务处理

    内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...

  4. 试试SQLSERVER2014的内存优化表

    试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技 ...

  5. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  6. 03.SQLServer性能优化之---存储优化系列

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概  述:http://www.cnblogs.com/dunitian/p/60413 ...

  7. 前端网络、JavaScript优化以及开发小技巧

    一.网络优化 YSlow有23条规则,中文可以参考这里.这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少. 1)合并压缩CSS.JavaScript.图片,静态资源CDN ...

  8. 数据库优化案例——————某市中心医院HIS系统

    记得在自己学习数据库知识的时候特别喜欢看案例,因为优化的手段是容易掌握的,但是整体的优化思想是很难学会的.这也是为什么自己特别喜欢看案例,今天也开始分享自己做的优化案例. 最近一直很忙,博客产出也少的 ...

  9. 【前端性能】高性能滚动 scroll 及页面渲染优化

    最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的 ...

随机推荐

  1. uva 465 - Overflow 高精度还是浮点数?

    uva 465 - Overflow  Overflow  Write a program that reads an expression consisting of two non-negativ ...

  2. node读写Excel操作

    目支持写Excel的node.js模块: node-xlsx: 基于Node.js解析excel文件数据及生成excel文件: excel-parser: 基于Node.js解析excel文件数据,支 ...

  3. HTML-CSS文件链接HTML的三种方式

    <!--css文本的链接方式有三种:分别是内联定义.链入内部css.和链入外部css--> <!--1.代码为:--> <!--<html> <head ...

  4. 学习tornado

    http://old.sebug.net/paper/books/tornado/ http://demo.pythoner.com/itt2zh/index.html http://tornado- ...

  5. 什么是Base64加密?为什么要有Base64加密?

    产生这篇文章的动力在于对接腾讯云服务的时候每次都要进行Base64编码之后才能进行签名,之前只知道Base64是个算法,但是不知道为啥都用这个算法,这次为了链接Base64究竟是个什么东东才在网络上各 ...

  6. input 和 button 的 border-box 模型和 IE8 错位

    用 input 和 button 时出现了几个奇怪的现象,先放几个 input 和 button CSS: * { margin:; padding:; } input,button { width: ...

  7. 在DO搭建自己的ss

    前期准备: 1.一个paypal账户 2.国外的一台VPS paypal的注册需要一个邮箱和一张信用卡即可. VPS的话经过搜索对比,决定使用DigitalOcean的.(点击此链接注册DO可获得10 ...

  8. Logstash Reference Getting started with Logstash

    进阶功能_Logstash_数据采集_用户指南_日志服务-阿里云 https://help.aliyun.com/document_detail/49025.html Logstash Referen ...

  9. <2014 04 26> 《Coders at Work编程人生:15位软件先驱访谈录》

    什么是老派程序员?调试只用printf,关心数据结构,先整体或先局部,不知道OO.IDE.TDD.BDD等等为何物.Ken Thompson,Jamie Zawinski,Joe Armstrong, ...

  10. .net ASPxGridView 使用手记

    统计汇总功能: TotalSummary属性:此属性必须设置KeyFieldName属性:Settings中的ShowFooter属性设置为True. DisplayFormat:同.net中的Str ...