yangpeng

导航

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

原先的测试不全面,发觉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的性能。  

.

posted on 2006-07-05 09:43  lvcha  阅读(4581)  评论(5编辑  收藏  举报