我通过TCP获取大容量数据。数据中有2种类型的XML数据包。我需要尽快处理它。c#大量数据的代码优化
<?xml version="1.0" encoding="UTF-8"?><xsi:Event> .... [dynamic length data] .... </xsi:Event>
和
<?xml version="1.0" encoding="UTF-8"?><ChannelHeartBeat xmlns="http://schema.broadsoft.com/xsi"/>
有时包没有XML声明。
这是旧代码。
char c = (char)streamReader.Read();
sb.Append(c);
if(sb.ToString().EndsWith("</xsi:Event>",StringComparison.OrdinalIgnoreCase))
{
....
sb.Clear();
}
if(sb.ToString().EndsWith("<ChannelHeartBeat xmlns=\"http://schema.broadsoft.com/xsi\"/>", StringComparison.OrdinalIgnoreCase))
{
....
sb.Clear();
}
ToString()
在上述代码中占用了26%的CPU时间。
下面是优化代码。它将性能提高了30%
char c = (char)streamReader.Read();
sb.Append(c);
n++;
if (n > 60)
{
if (c == '>')
{
if (n < 105)
{
string temp = sb.ToString();
if (temp.EndsWith("<ChannelHeartBeat xmlns=\"http://schema.broadsoft.com/xsi\"/>", StringComparison.OrdinalIgnoreCase))
{
sb.Clear();
n = 0;
}
}
if (n > 700)
{
string temp = sb.ToString();
if (temp.EndsWith("</xsi:Event>", StringComparison.OrdinalIgnoreCase))
{
sb.Clear();
n = 0;
}
}
}
}
}
ToString()
现在占用8%的CPU时间。
我想进一步优化代码。任何建议都是值得欢迎的。
在此先感谢。
可以并行代码,以处理XML并行。 – Jepessen
您可以尝试使用'StringBuilder.ToString(int startIndex,int length)'函数仅转换部分字符串_(例如前105个字符或后50个字符)_。那么操作应该至少快一点。 – Julo
显示,你如何声明并填充'sb' – Backs