传统的XML文件通常是utf8编码的文本文件。使用文本文件好处在于方便查阅及修改。

SOUI使用XML做为布局描述语言,所有的布局资源都是XML。文本文件格式自由,XML解析器需要对文件中的字符逐个解析,最后生成DOM树。

解析过程还要判断各种格式合法性以及特殊符号的转义等工作,导致性能方面很难进一步提高。SOUI中采用了现在开源XML解析库中非常优秀的pugixml作为解析器,根据作者的统计,其解析XML的速度甚至和strlen方法差不多。

考虑到文本XML解析过程本身相对复杂,我们在SOUI3中实现了一种XML预编译的二进制格式。

在二进制格式中,第一部分是文件头,第二部分是字符串表,第三部分是DOM结构。

通过将文本XML转换成二进制XML,可以显著提高XML的解析速度。

下面是重复解析一个25K的XML文件50次消耗时长在debug及release模式下的对比:

debug模式:

1 0.000000 14604 demod.exe text xml: 541, bin xml:226
2 0.000741 14604 demod.exe text xml: 433, bin xml:230
3 0.001585 14604 demod.exe text xml: 460, bin xml:259
4 0.002432 14604 demod.exe text xml: 471, bin xml:293
5 0.003319 14604 demod.exe text xml: 456, bin xml:323
6 0.004165 14604 demod.exe text xml: 487, bin xml:242
7 0.005081 14604 demod.exe text xml: 476, bin xml:334
8 0.005917 14604 demod.exe text xml: 461, bin xml:271
9 0.006747 14604 demod.exe text xml: 457, bin xml:275
10 0.007547 14604 demod.exe text xml: 458, bin xml:245
11 0.008352 14604 demod.exe text xml: 447, bin xml:256
12 0.009104 14604 demod.exe text xml: 445, bin xml:215
13 0.010045 14604 demod.exe text xml: 483, bin xml:312
14 0.010903 14604 demod.exe text xml: 465, bin xml:287
15 0.011820 14604 demod.exe text xml: 490, bin xml:283
16 0.012670 14604 demod.exe text xml: 515, bin xml:232
17 0.013396 14604 demod.exe text xml: 441, bin xml:211
18 0.014200 14604 demod.exe text xml: 435, bin xml:243
19 0.015056 14604 demod.exe text xml: 437, bin xml:297
20 0.015985 14604 demod.exe text xml: 505, bin xml:293
21 0.016775 14604 demod.exe text xml: 442, bin xml:219
22 0.017837 14604 demod.exe text xml: 581, bin xml:363
23 0.018832 14604 demod.exe text xml: 573, bin xml:290
24 0.019714 14604 demod.exe text xml: 531, bin xml:223
25 0.020532 14604 demod.exe text xml: 459, bin xml:231
26 0.021473 14604 demod.exe text xml: 582, bin xml:264
27 0.022232 14604 demod.exe text xml: 417, bin xml:248
28 0.022893 14604 demod.exe text xml: 413, bin xml:180
29 0.023523 14604 demod.exe text xml: 386, bin xml:179
30 0.024150 14604 demod.exe text xml: 385, bin xml:177
31 0.025061 14604 demod.exe text xml: 476, bin xml:332
32 0.025818 14604 demod.exe text xml: 455, bin xml:253
33 0.026476 14604 demod.exe text xml: 408, bin xml:182
34 0.027109 14604 demod.exe text xml: 388, bin xml:178
35 0.027741 14604 demod.exe text xml: 387, bin xml:178
36 0.028402 14604 demod.exe text xml: 404, bin xml:193
37 0.029055 14604 demod.exe text xml: 387, bin xml:197
38 0.029685 14604 demod.exe text xml: 386, bin xml:178
39 0.030313 14604 demod.exe text xml: 385, bin xml:178
40 0.030941 14604 demod.exe text xml: 386, bin xml:177
41 0.031570 14604 demod.exe text xml: 385, bin xml:180
42 0.032197 14604 demod.exe text xml: 386, bin xml:177
43 0.032923 14604 demod.exe text xml: 408, bin xml:245
44 0.033569 14604 demod.exe text xml: 390, bin xml:186
45 0.034224 14604 demod.exe text xml: 385, bin xml:208
46 0.034852 14604 demod.exe text xml: 386, bin xml:178
47 0.035479 14604 demod.exe text xml: 386, bin xml:178
48 0.036104 14604 demod.exe text xml: 384, bin xml:176
49 0.036730 14604 demod.exe text xml: 384, bin xml:177
50 0.037352 14604 demod.exe text xml: 384, bin xml:174
 
release模式:

1 0.000000 636 demo.exe text xml: 234, bin xml:179
2 0.000423 636 demo.exe text xml: 191, bin xml:167
3 0.000856 636 demo.exe text xml: 198, bin xml:158
4 0.001449 636 demo.exe text xml: 226, bin xml:260
5 0.001936 636 demo.exe text xml: 226, bin xml:159
6 0.002392 636 demo.exe text xml: 200, bin xml:158
7 0.002865 636 demo.exe text xml: 197, bin xml:157
8 0.003324 636 demo.exe text xml: 203, bin xml:162
9 0.003779 636 demo.exe text xml: 202, bin xml:158
10 0.004216 636 demo.exe text xml: 209, bin xml:150
11 0.004710 636 demo.exe text xml: 191, bin xml:220
12 0.005302 636 demo.exe text xml: 274, bin xml:190
13 0.005785 636 demo.exe text xml: 207, bin xml:191
14 0.006211 636 demo.exe text xml: 190, bin xml:155
15 0.006640 636 demo.exe text xml: 202, bin xml:156
16 0.007081 636 demo.exe text xml: 207, bin xml:155
17 0.007526 636 demo.exe text xml: 201, bin xml:157
18 0.007937 636 demo.exe text xml: 175, bin xml:170
19 0.008326 636 demo.exe text xml: 180, bin xml:145
20 0.008704 636 demo.exe text xml: 175, bin xml:139
21 0.009085 636 demo.exe text xml: 174, bin xml:143
22 0.009468 636 demo.exe text xml: 175, bin xml:144
23 0.009830 636 demo.exe text xml: 174, bin xml:143
24 0.010209 636 demo.exe text xml: 173, bin xml:142
25 0.010605 636 demo.exe text xml: 175, bin xml:141
26 0.011005 636 demo.exe text xml: 173, bin xml:175
27 0.011397 636 demo.exe text xml: 162, bin xml:173
28 0.011732 636 demo.exe text xml: 162, bin xml:128
29 0.012039 636 demo.exe text xml: 139, bin xml:124
30 0.012349 636 demo.exe text xml: 140, bin xml:126
31 0.012658 636 demo.exe text xml: 139, bin xml:126
32 0.012967 636 demo.exe text xml: 139, bin xml:126
33 0.013273 636 demo.exe text xml: 138, bin xml:125
34 0.013581 636 demo.exe text xml: 139, bin xml:125
35 0.013891 636 demo.exe text xml: 139, bin xml:127
36 0.014197 636 demo.exe text xml: 138, bin xml:124
37 0.014506 636 demo.exe text xml: 138, bin xml:127
38 0.014818 636 demo.exe text xml: 139, bin xml:126
39 0.015142 636 demo.exe text xml: 143, bin xml:132
40 0.015466 636 demo.exe text xml: 140, bin xml:134
41 0.015774 636 demo.exe text xml: 139, bin xml:126
42 0.016082 636 demo.exe text xml: 139, bin xml:126
43 0.016420 636 demo.exe text xml: 139, bin xml:155
44 0.016733 636 demo.exe text xml: 142, bin xml:127
45 0.017071 636 demo.exe text xml: 138, bin xml:156
46 0.017381 636 demo.exe text xml: 139, bin xml:127
47 0.017691 636 demo.exe text xml: 139, bin xml:127
48 0.017996 636 demo.exe text xml: 138, bin xml:125
49 0.018305 636 demo.exe text xml: 138, bin xml:127
50 0.018611 636 demo.exe text xml: 139, bin xml:123
 
可以发现, 在debug模式下, 二进制xml解析差不多有5 0% 的速度提升, 但在release模式下, 第一次大概有30%, 后面重复提升差不多是10-20%。
 
使用二进制XML除了解析速度的提高以外, 文件大小可以缩小5 0% 。测试的25K XML文件, 转换成二进制后变为14K。
 
此外使用二进制XML还可以在一定程度上保护文件不被轻易的解读。
 
SOUI3中, 我们提供了一个新的工具xml2bin.exe, 使用它可以批量的将文本XML转换为二进制XML。
使用如下命令将文本XML转换为二进制:
D:\work\soui3.git\tools>xml2bin.exe d:\work\soui3.git\demo\uires
convert d:\work\soui3.git\demo\uires\anim\love.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\anim\rotate.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\anim\slide_hide.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\anim\slide_show.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\translation files\lang_cn.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\uidef\init.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\valueAni\alpha.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\valueAni\color.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\values\color.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\values\skin.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\values\string.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\values\template.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\calendar.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_formatmsg.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_main.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_set_skin.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_skiatext.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_skinset.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_tip.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_wrap_content.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\love.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\menu_lv.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\menu_test.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\menuex_test.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_about.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_ani3.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_animator.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_ctrls.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_layout.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_misc.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_script.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_skia.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_treeview.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_webkit.xml to bin return succeed!
convert d:\work\soui3.git\demo\uires\xml\treectrl.xml to bin return succeed!
 
相反的, 我们下可以使用如下命令将二进制XML还原为文本XML:
D:\work\soui3.git\tools>xml2bin.exe d:\work\soui3.git\demo\uires toxml
convert d:\work\soui3.git\demo\uires\anim\love.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\anim\rotate.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\anim\slide_hide.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\anim\slide_show.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\translation files\lang_cn.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\uidef\init.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\valueAni\alpha.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\valueAni\color.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\values\color.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\values\skin.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\values\string.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\values\template.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\calendar.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_formatmsg.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_main.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_set_skin.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_skiatext.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_skinset.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_tip.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\dlg_wrap_content.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\love.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\menu_lv.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\menu_test.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\menuex_test.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_about.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_ani3.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_animator.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_ctrls.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_layout.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_misc.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_script.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_skia.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_treeview.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\page_webkit.xml to xml return succeed!
convert d:\work\soui3.git\demo\uires\xml\treectrl.xml to xml return succeed!
 
新版本SOUI自动识别XML是文本还是二进制版本, 所以格式转换不会影响程序的运行。
 
启程软件   2019年9月20日

在SOUI3中使用预编译XML的更多相关文章

  1. DelphiXE10.1项目中增加预编译的方法

    操作: 菜单选择Proceject->Options->Delphi Compilerz在Conditional Defines(第一行)中添加预编译标识.例:VCL代码:uses{$IF ...

  2. iOS中的预编译指令的初步探究

    目录 文件包含 #include #include_next #import 宏定义 #define #undef 条件编译 #if #else #endif #if define #ifdef #i ...

  3. C中的预编译宏定义

     可以用宏判断是否为ARC环境 #if _has_feature(objc_arc) #else //MRC #endif C中的预编译宏定义 -- 作者: infobillows 来源:网络 在将一 ...

  4. C/C++中的预编译指令

    工作中遇到的: 一个头文件中的: #pragma warning(disable:4996)#pragma warning(disable:4244)#pragma warning(disable:4 ...

  5. C#中的预编译指令介绍

    原文:C#中的预编译指令介绍 1.#define和#undef 用法: #define DEBUG #undef DEBUG #define告诉编译器,我定义了一个DEBUG的一个符号,他类似一个变量 ...

  6. 在VisualGDB中配置预编译头加快编译速度

    今天是中秋佳节,但是写完已经是第二天凌晨了,还是祝大家中秋快乐! VS对C++的支持相较GCC太弱了,连续几个VS版本对C++的改进都很小.很少.对Cpper也许是一种痛,我们也许希望能使用VS的强大 ...

  7. js中的预编译

    预编译 js执行顺序: 词法/语法分析 预编译 解释执行 js中存在预编译 function demo() { console.log('I am demo'); } demo(); //I am d ...

  8. javascript中的预编译问题

    Js作为脚本语言,可以不需要编译直接运行,但遇到类似变量或者函数同名,预编译方面的知识可以帮助我们更好解决问题. 示例: 这是一段js中普通的函数调用代码 <script>1.    // ...

  9. 怎么向Xcode6 IOS8之后向项目中添加预编译文件

    苹果的XCode在6版本之后新建项目时取消了自动创建预编译头文件pch,该文件里存放的工程中一些不常被修改的代码,比如常用的框架头文件,这样做的目的提高编译器编译速度.我们可以往里面加入一些项目中都要 ...

随机推荐

  1. JVM内存结构思维导图

  2. 【maven】IDEA:存在jar包,pom.xml文件没报错,但是Maven-Project-Dependencies有红线报错

    1.这个问题很简单 把pom.xml里这些出错的jar包的引用先删除,再刷新一次,再添上,就行了 2.大概是idea有点反应迟钝

  3. 2019-11-29-C#-很少人知道的科技

    title author date CreateTime categories C# 很少人知道的科技 lindexi 2019-11-29 10:12:43 +0800 2018-03-16 08: ...

  4. 关于mysql的查询优化

    由于工作原因,最近甲方客户那边多次反应了他们那边的系统查询速度慢,经过排除之后,发现他们那边的数据库完全没有用到索引,简直坑得一笔,通过慢查询日志分析,为数据表建立了适当的索引之后,查询速度明显的提高 ...

  5. QQ第三方登陆

    第一步 引入第三方登陆类,实例化,调用类中方法getInstance()跳转到授权页面 第二步 登陆成功的回调方法,qq_return则是登陆成功会获取到的数据的处理方法 qq_return方法: 本 ...

  6. PHP5 构造函数

    在最近自己写的PHP小程序中遇到了如何使用PHP构造函数的情况,在PHP中允许我们在一个类中定义一个构造函数 如: <?php class User { public $name; functi ...

  7. [转载]一个支持Verilog的Vim插件——前言

    原文地址:一个支持Verilog的Vim插件--前言作者:hover 随着设计复杂度的增加,在书写代码中枯燥的重复性的劳动会越来越多.例如,例化若干个有上百个端口的子模块,这个工作没有任何创造性可言, ...

  8. java面试(集合类)03

    1.Collection 和 Collections 有什么区别? Collection 是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如 List.Set 等 ...

  9. php中禁止单个ip与ip段访问的代码小结

    1.禁止单个IP <?php //IP访问限制 if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP' ...

  10. JDK的二进制安装

    JDK的二进制安装步骤 1. Jdk1.8二进制包下载路径http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads- ...