tinyxml优化之一

最近在搞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的

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

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

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

时间: 2024-10-10 05:08:36

tinyxml优化之一的相关文章

tinyxml优化之二

原文链接:http://www.cnblogs.com/zouzf/p/4216046.html tinyxml优化之一说到了效率在差别有三方面的原因:解析的方式.内存分配(字符串操作).冗余的安全性检查,那么优化就从这些方面着手: 1.修改解析的方式 无论是tinyxml1的逐字符扫描还是tinyxml2的递归解析,最本质的都是扫描每一个字符来进行分析,如果我们知道每一个节点.属性的name和value的长度和位置,在解析的时候按需要移动文本指针,岂不是可以快很多么? 实现思路如下: (1).

iOS开发——项目实战总结&UITableView性能优化与卡顿问题

UITableView性能优化与卡顿问题 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候,就会堆积很多cell.如果重用cell,为cell创建一个ID 每当需要显示cell 的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell 2.避免cell的重新布局 cell的布局填充等操作 比较耗时,一般创建时就布局好 如可以将cell单独放到一个自定义类,初始化时就布局好

Java性能优化之JVM GC(垃圾回收机制)

Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.stop-the-world 意味着JVM因为需要执行GC而停止了应用程序的执行.当stop-the-world 发生时,除GC所需的线程外,所有的线程都进入等待状态,直到GC任务完成.GC优化很多时候就是减少stop-the-world 的发生. JVM GC回收哪个区域内的垃圾? 需要注意的是,JV

MySQL 索引优化原则

一.索引优化原则 1.最左前缀匹配原则,联合索引,mysql会从做向右匹配直到遇到范围查询(>.<.between.like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整. 2.=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优

sql优化

1.all: 全表扫描,遍历全表找到匹配的行 index:索引全扫描,遍历整个索引来查询匹配的行 range:索引范围扫描,常见于<,>,>=,between等操作符 ref: 使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录行 eq_ref:类似ref,区别就是使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配.简单来说,就是多表连接中使用primary key或者unique index 作为关联条件 const/system:单表中最多有一个匹配行,查询起

试试SQLSERVER2014的内存优化表

原文:试试SQLSERVER2014的内存优化表 试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技术来支持大规模OLTP工作负载. 就算如此,要利用此新功能,数据库必须包含"内存优化"文件组和表 即所配置的文件组和表使用Hekaton技术. 幸运的是,SQL Server 2014使这一过程变得非常简单直接. 要说明其工作原理,我们来创

Linux性能优化之磁盘优化(三)

前言 关于本章内容,设计的东西比较多.这里会有关于文件系统.磁盘.CPU等方面的知识,以及涉及到关于这方面的性能排查等. 术语 文件系统通过缓存和缓冲以及异步I/O等手段来缓和磁盘的延时对应用程序的影响.为了更详细的了解文件系统,以下就简单介绍一些相关术语: 文件系统:一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问.另外,一些表示设备.套接字和管道的特殊文件类型,以及包含文件访问时间戳的元数据. 文件系统缓存:主存(通常是DRAM) 的一块区域,用来缓存文

一个配置表优化的想法

今天下班在班车上想了一个关于配置表存储的小优化,起因是早上的时候发现了一个bug,这个bug是由于在运行时动态更改了一个列表配置导致的. 其实关于这种运行时"偷偷"改配置的问题我之前也有考虑过,这种应该是一不小心就会写出的,这不终于都出了一个. 至于如何预防这种问题,我认为在python里面似乎也没有什么好的解决方法,因为它不像c++有const语义,但有一个稍尽人事的预防措施就是把列表型的配置读成元组(tuple).而由此衍生出的一个想法便是:把配置表中所有的列表型配置都读成共享的元

web单机优化

又得开始写博客了,目测又要一周一篇了,当然了这不算python跟前端的,个人喜欢notepad++可惜不能放图片,word什么的太讨厌了 为什么要单机优化呢,很简单,因为不论以后是各类集群也好,物理机虚拟机也好,只有将个人优势发挥到最大才能提升整体的最低限度,因为木桶原理嘛:再一个,穷啊,玩linux那就是得优化,极尽的压榨操作系统的性能.集群什么的都是从单机演化出来的,so,优化好单机是你继续下一步的初始条件 我们从一个请求连接的总流程来看一下我们可优化的点(运维角度) 其实这中间的每一个步骤