Fastjson内幕
JSON协议使用方便,越来越流行。JSON的处理器有很多,为什么需要再写一个呢?因为我们需要一个性能很好的JSON Parser,希望JSON Parser的性能有二进制协议一样好,比如和protobuf一样,这可不容易,但确实做到了。有人认为这从原理上就是不可能的,但是计算机乃实践科学,看实际的结果比原理推导更重要。
这篇文章告诉大家:
* Fastjson究竟有多快
* 为什么Fastjson这么快
* 你能用Fastjson来做什么!
* 如何获得fastjson?
首先,Fastjson究竟有多快?
我们看一下使用https://github.com/eishay/jvm-serializers/提供的程序进行测试得到的结果:
在上面例子看,虚线标注的三个部分是key,如果key_id、key_name、key_salary这三个key是顺序的,就可以做优化处理,这三个key不需要被读取出来,只需要比较就可以了。
这种算法分两种模式,一种是快速模式,一种是常规模式。快速模式是假定key是顺序的,能快速处理,如果发现不能够快速处理,则退回常规模式。保证性能的同时,不会影响功能。
在这个例子中,常规模式需要处理13个token,快速模式只需要处理6个token。
实现sort field fast match算法的代码在这个类[com.alibaba.fastjson.parser.deserializer.ASMDeserializerFactory|http://code.alibabatech.com/svn/fastjson/trunk/fastjson/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java],是使用asm针对每种类型的VO动态创建一个类实现的。
这里是有一个用于演示sort field fast match算法的代码:
http://code.alibabatech.com/svn/fastjson/trunk/fastjson/src/test/java/data/media/ImageDeserializer.java
int hash = 0;for (;;) { ch = buf[index++]; if (ch == '"') { bp = index; this.ch = ch = buf[bp]; strVal = symbolTable.addSymbol(buf, start, index - start - 1, hash); // 通过symbolTable来获得缓存好的symbol,包括fieldName、enumValue break; } hash = 31 * hash + ch; // 在token scan的过程中计算好hash // ... ...}