基于有限状态自动机实现高效xml/json解析器

来源:互联网 发布:13周胎儿nt数据看男女 编辑:程序博客网 时间:2024/05/18 00:57

分布式计算的广泛应用,使得浏览器与服务器之间,或者不同的服务器之间的(异构)应用程序之间对话的需求变得十分普遍。在这个背景下,JSON、xml被广泛采用,然而这些通用的数据结构的使用是需要付出昂贵的代价的,主要体现在对cpu资源和io资源的特殊需求上,包括对json/xml数据流的解析产生的计算需求,以及传输过程中tag标签所引起的额外数据输出开销,另外一方面,xml/json作为应用程序基础库,被使用的频率是非常高的,在高并发、高吞吐量情况下,所产生的额外开销是惊人的。

因此,如何选取高效的json/xml解析器,事关应用程序的整体性能。

本人过去开发经历中,使用过很多主流开源json/xml解析器,也曾经花费很长时间寻找高性能解析器,总体感觉是目前的常用解析器性能普遍不好,主要原因有为了符合相关规费,在通用性上考虑的太多,比如对xml namespace的支持等,这些都对解析器在解析过程中产生了一些额外的开销,包括计算上和内存使用上的开销;也有算法上的因素,各种开源的解析器仅开源了代码,并没有开源设计,造成开源的解析器代码比较难于理解。

两年前,发现实在是无法找到符合自己需求的解析器,所以终于下定决心定制开发一个满足特定需求的,尽量通用的最高效的解析器,终于,经过一个多月的开发、重构、调优,开发完成了自认为是最高效的json/xlm解析器,并与一个高效的开源xpath解析器融合起来,开发出一个非常好的“esb产品",完全配置化,速度性能超一流,完全胜过国外主流ESB产品。

吹牛的话不说了,今天喝了点酒,决定把解析器相关的一部分核心设计贡献出来,主要是json/xml解析器的有限状态自动机设计图,供有共同兴趣的朋友参考,代码暂时不方便贡献了,望理解。

(注:在算法选择上,也是反反复复斟酌了挺长时间,期间也阅读了大量的自动机、词法分析、语法分析、javacc工具等,最终还是选择了基于字符分析的自动机来实现。这个过程中有一些深刻体会,对大学时学的编译理论的理解有了一个很大的提升,通过实践了,发现原来真的很简单。)

上图。

图一:Json解析器level1状态机



图二:Json解析器level2状态机 (readObject)



图三:Json解析器level2状态机 (readArray)






原创粉丝点击