本文参考资料

一种简单,轻量,灵活的C#对象转Json对象的方案

[源码]Literacy 快速反射读写对象属性,字段

 

  一段废话

之前我已经介绍了这个方案的名称为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
测试机配置

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-02-15
  • 2022-12-23
  • 2021-09-09
  • 2021-11-30
  • 2022-12-23
猜你喜欢
  • 2021-06-24
  • 2021-11-18
  • 2022-02-07
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案