本文参考资料
一段废话
之前我已经介绍了这个方案的名称为JsonBuilder,这套方案最大的好处在于它的灵活可扩展性上,所以我可以很方便的对他进行优化和扩展!
性能优化
JsonBuilder第一版对一般对象的是进行实时反射的,所以性能不会很好,所以我首先想到的是优化他的性能
看我前几天发表过一篇《[源码]Literacy 快速反射读写对象属性,字段》的文章,这东西的效率不错,用来代替反射正好。
我把优化后的类取名QuickJsonBuilder
在继承JsonBuilder的基础上,我仅仅需要重写一个方法
public class QuickJsonBuilder : JsonBuilder { protected override void AppendOther(object obj) { Literacy lit = new Literacy(obj.GetType()); string fix = ""; Buff.Append('{'); foreach (var p in lit.Property) { Buff.Append(fix); AppendKey(p.Name, false); AppendObject(p.GetValue(obj));
fix = ','; } Buff.Append('}'); } }
像这样我很简单的将原来的实时反射改成了Literacy
但是这样显然并不能保证性能,所以我还要加一个缓存
static Dictionary<Type, Literacy> _LitCache = new Dictionary<Type, Literacy>(); protected override void AppendOther(object obj) { Literacy lit; Type type = obj.GetType(); if (_LitCache.TryGetValue(type, out lit) == false) { lock (_LitCache) { if (_LitCache.TryGetValue(type, out lit) == false) { lit = new Literacy(type); _LitCache.Add(type, lit); } } } string fix = ""; Buff.Append('{'); foreach (var p in lit.Property) { Buff.Append(fix); AppendKey(p.Name, false); AppendObject(p.GetValue(obj));
fix = ','; } Buff.Append('}'); }
缓存本身是全局静态的,所以为了防止多线程并发的问题,特别加了锁
再为了它能性能能够好上那么一点点(更多的是为了自己的强迫症吧....),再修改一些地方
static Dictionary<Type, Literacy> _LitCache = new Dictionary<Type, Literacy>(); protected override void AppendOther(object obj) { Literacy lit; Type type = obj.GetType(); if (_LitCache.TryGetValue(type, out lit) == false) { lock (_LitCache) { if (_LitCache.TryGetValue(type, out lit) == false) { lit = new Literacy(type); _LitCache.Add(type, lit); } } } Buff.Append('{'); var ee = lit.Property.GetEnumerator(); if (ee.MoveNext()) { AppendKey(ee.Current.Name, false); AppendObject(ee.Current.GetValue(obj)); while (ee.MoveNext()) { Buff.Append(','); AppendKey(ee.Current.Name, false); AppendObject(ee.Current.GetValue(obj)); } } Buff.Append('}'); }
好了来看看他和他父亲在性能上的差异:
测试代码和《几个常用Json组件的性能测试》中的是一样的,
I7-2630 4核8线程 主频2.0 内存 1600 4G*2 没有显卡 硬盘 闪迪 msata 128 r:500m/s w:350m/s