• 在SOUI3中使用预编译XML


    传统的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:worksoui3.git ools>xml2bin.exe d:worksoui3.gitdemouires
    convert d:worksoui3.gitdemouiresanimlove.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresanim otate.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresanimslide_hide.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresanimslide_show.xml to bin return succeed!
    convert d:worksoui3.gitdemouires ranslation fileslang_cn.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresuidefinit.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresvalueAnialpha.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresvalueAnicolor.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresvaluescolor.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresvaluesskin.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresvaluesstring.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresvalues emplate.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlcalendar.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_formatmsg.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_main.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_set_skin.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_skiatext.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_skinset.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_tip.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_wrap_content.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmllove.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlmenu_lv.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlmenu_test.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlmenuex_test.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_about.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_ani3.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_animator.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_ctrls.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_layout.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_misc.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_script.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_skia.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_treeview.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_webkit.xml to bin return succeed!
    convert d:worksoui3.gitdemouiresxml reectrl.xml to bin return succeed!
     
    相反的, 我们下可以使用如下命令将二进制XML还原为文本XML:
    D:worksoui3.git ools>xml2bin.exe d:worksoui3.gitdemouires toxml
    convert d:worksoui3.gitdemouiresanimlove.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresanim otate.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresanimslide_hide.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresanimslide_show.xml to xml return succeed!
    convert d:worksoui3.gitdemouires ranslation fileslang_cn.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresuidefinit.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresvalueAnialpha.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresvalueAnicolor.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresvaluescolor.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresvaluesskin.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresvaluesstring.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresvalues emplate.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlcalendar.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_formatmsg.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_main.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_set_skin.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_skiatext.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_skinset.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_tip.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmldlg_wrap_content.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmllove.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlmenu_lv.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlmenu_test.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlmenuex_test.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_about.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_ani3.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_animator.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_ctrls.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_layout.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_misc.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_script.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_skia.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_treeview.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxmlpage_webkit.xml to xml return succeed!
    convert d:worksoui3.gitdemouiresxml reectrl.xml to xml return succeed!
     
    新版本SOUI自动识别XML是文本还是二进制版本, 所以格式转换不会影响程序的运行。
     
    启程软件   2019年9月20日
  • 相关阅读:
    python下载文件(图片)源码,包含爬网内容(爬url),可保存cookie
    查看linux下各数据类型的大小
    linux 内核代码精简
    前序 中序 后序 遍历 递归 非递归算法 java实现
    netflix turbine概述
    How Hystrix Works?--官方
    netflix ribbon概述
    spring-cloud-netflix集成的服务
    支付系统设计包含:账户,对账,风控...!史上最全的!--转
    利用CORS实现跨域请求--转
  • 原文地址:https://www.cnblogs.com/setoutsoft/p/11560566.html
Copyright © 2020-2023  润新知