设为首页
加入收藏
站内地图
旧版入口
当前位置:首页 > 站长学院 > 网络编程 > ASP.NET

解决了json反序列化的效率问题

作者:佚名 出处:网络转载 时间:07-06 点击:

内容载入中...
您的支持我们的动力 rosibo 原先的测试不全面,发觉class结构一复杂,反序列化时分析json string出现了严重的效率问题。
多方求助也没有解决。
其间试了很多人的json实现(官方的两个,google到的一个,teddy的nbear里的)。
都有这个问题。

后来,一点点排查,先从一个最简单的json字符串开始,逐渐往里面加属性测试。
最后发觉当我加入 "a":1.01 时速度很慢,而 "a":1 时速度正常。

然后才定位到问题所在:

官方代码:
      if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+')
            {
                try
                {
                    return Convert.ToInt32(s);
                }
                catch (Exception e)
                {
                    string msg = e.Message;
                }
                try
                {
                    return Convert.ToDouble(s, NumberFormatInfo.InvariantInfo);
                }
                catch (Exception e)
                {
                    string msg = e.Message;
                }
            }
            
这段代码在c#里面会有严重的效率问题。
应该是C#的异常机制不完善造成的!
在java里,利用异常做这种工作对效率没有任何影响,(当然,也不提倡这么写,偷懒的行为)。

把这段代码转换成
      if ((b >= '0' && b <= '9') || b == '.' || b == '-' || b == '+')
            {
                if (s.Contains("."))
                    return Convert.ToDouble(s, NumberFormatInfo.InvariantInfo);
                else
                {
                    long tmp = Convert.ToInt64(s);
                    if (tmp > Int32.MaxValue || tmp < Int32.MinValue)
                        return tmp;
                    return Convert.ToInt32(tmp);
                }
            }
           
问题解决。


速度提高50倍。

另外,用dynamic method调用代替了反射,也提高了序列化/反序列化bean的性能。
收藏本文:
】【打印页面】【推荐给朋友】【关闭窗口

站长学院

推荐信息