解决了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的性能。
.
多方求助也没有解决。
其间试了很多人的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的性能。
.