原文链接: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. plsql数组、表和对象

    --数组DECLARE TYPE test_plsql_varray IS VARRAY(100) OF VARCHAR2(20); temp_varray1 test_PLSQL_VARRAY := ...

  2. 面试之JavaWeb篇(十三)

    148,AJAX有哪些有点和缺点? 优点: 1.最大的一点是页面无刷新,用户的体验非常好. 2.使用异步方式与服务器通信,具有更加迅速的响应能力. 3.可以把以前一些服务器负担的工作转嫁到客户端,利用 ...

  3. java动态编译 (java在线执行代码后端实现原理)(二)

    在上一篇java动态编译 (java在线执行代码后端实现原理(一))文章中实现了 字符串编译成字节码,然后通过反射来运行代码的demo.这一篇文章提供一个如何防止死循环的代码占用cpu的问题. 思路: ...

  4. 面试STAR法则

    昨天投了几家公司的简历,A公司还没看简历,B公司没有通过简历,另外的后说(其实只投了这两家),B公司最终给了蛮中肯的回复: 虽然,一开始看到这样的结果,有些失落,仔细看过回复后,有些不屑和好奇.百度了 ...

  5. Oracle数据库 number 长度与 Short Integer Long BigDecimal 对应关系

    转自:https://blog.csdn.net/edward9145/article/details/21398657 Oracle数据库 number 长度与 Short Integer Long ...

  6. HYSBZ 2160 拉拉队排练(回文树)

    2160: 拉拉队排练 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 825  Solved: 324 [Submit][Status][Discu ...

  7. AutoArchive settings explained

    AutoArchive settings explained Applies To: Outlook 2010 More... Less AutoArchive helps manage the sp ...

  8. 为何不分类---失效的google image

    w满屏的框架,甚至翻页了还是框架,起始user是想看下bootstrap在框架出来前是什么东西.

  9. Java基础语法 - 面向对象 - 局部变量

    如果在一个成员方法内定义一个变量,那么这个变量就被称为局部变量. 局部变量在方法执行时被创建,在方法执行结束时被销毁.局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误 package m ...

  10. Java 面向对象编程介绍

    面向对象的概念 类与对象的关系 封装 面向对象 面向过程: 强调的是过程(动作) 面向对象: 强调的是对象(实体) 面向对象的特点 面向对象就是一种常见的思想,符合人们的思考习惯; 面向对象的出现,将 ...