针对大数据量的c#代码优化
我正在通过TCP获取大量数据。数据中有两种类型的XML数据包。我需要尽快处理它针对大数据量的c#代码优化,c#,string,optimization,cpu-usage,C#,String,Optimization,Cpu Usage,我正在通过TCP获取大量数据。数据中有两种类型的XML数据包。我需要尽快处理它 <?xml version="1.0" encoding="UTF-8"?><xsi:Event> .... [dynamic length data] .... </xsi:Event> ToString()现在占用了8%的CPU时间 我想进一步优化代码。欢迎提出任何建议 提前谢谢 您可以尝试使用循环和索引器检查字符串生成器是否以给定字符串结尾,看看这是否提高了性能。例如: p
<?xml version="1.0" encoding="UTF-8"?><xsi:Event> .... [dynamic length data] .... </xsi:Event>
ToString()
现在占用了8%的CPU时间
我想进一步优化代码。欢迎提出任何建议
提前谢谢 您可以尝试使用循环和索引器检查字符串生成器是否以给定字符串结尾,看看这是否提高了性能。例如:
public static class Extensions {
public static bool EndsWith(this StringBuilder sb, string target, bool caseInsensetive = false) {
// if sb length is less than target string
// it cannot end with it
if (sb.Length < target.Length)
return false;
var offset = sb.Length - target.Length;
for (int i = sb.Length - 1; i >= offset; i--) {
var left = sb[i];
var right = target[i - offset];
// conver to upper-case for insensetive comparision
// if necessary
if (caseInsensetive) {
left = Char.ToUpper(left, CultureInfo.InvariantCulture);
right = Char.ToUpper(right, CultureInfo.InvariantCulture);
}
// fail fast
if (left != right)
return false;
}
return true;
}
}
公共静态类扩展{
公共静态bool EndsWith(此StringBuilder sb,字符串目标,bool caseinsenseve=false){
//如果sb长度小于目标字符串
//它不能就此结束
如果(sb长度<目标长度)
返回false;
var offset=sb.Length—目标长度;
对于(int i=sb.Length-1;i>=offset;i--){
var left=sb[i];
var right=目标[i-偏移];
//转换为大写,用于不敏感比较
//必要时
if(caseinsenseve){
左=Char.ToUpper(左,CultureInfo.InvariantCulture);
右=Char.ToUpper(右,CultureInfo.InvariantCulture);
}
//快速失败
如果(左!=右)
返回false;
}
返回true;
}
}
用法:
const string HeartBeatEnding = "<ChannelHeartBeat xmlns=\"http://schema.broadsoft.com/xsi\"/>";
const string EventEnding = "</xsi:Event>";
char c = (char)streamReader.Read();
sb.Append(c);
if (sb.EndsWith(EventEnding)) {
// do stuff
}
else if (sb.EndsWith(HeartBeatEnding)) {
// do stuff
}
const字符串HeartBeatEnding=“”;
常量字符串EventEnding=“”;
char c=(char)streamReader.Read();
sb.附加(c);
如果(某人结束(事件结束)){
//做事
}
如果(某人结束了(心碎)){
//做事
}
您可以并行化代码,以便并行处理xml。您可以尝试使用StringBuilder.ToString(int startIndex,int length)
函数仅转换字符串的一部分(例如前105个字符或后50个字符)。那么操作应该至少快一点。演示一下,如何声明和填充sb
不要多次调用sb.ToString()
,用块构造字符串是昂贵的。使用基于数组的缓冲区而不是StringBuilder
或List
也可能会有所帮助(检查性能以确认)。您可以使用循环和索引器(sb[i]
)检查字符串生成器是否以某个字符串结尾,从而避免使用不同的数据结构完全执行ToString
,现在使用列表,它工作得非常好。很高兴知道(虽然StringBuilder内部也是字符列表)。
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;
}
}
}
}
}
public static class Extensions {
public static bool EndsWith(this StringBuilder sb, string target, bool caseInsensetive = false) {
// if sb length is less than target string
// it cannot end with it
if (sb.Length < target.Length)
return false;
var offset = sb.Length - target.Length;
for (int i = sb.Length - 1; i >= offset; i--) {
var left = sb[i];
var right = target[i - offset];
// conver to upper-case for insensetive comparision
// if necessary
if (caseInsensetive) {
left = Char.ToUpper(left, CultureInfo.InvariantCulture);
right = Char.ToUpper(right, CultureInfo.InvariantCulture);
}
// fail fast
if (left != right)
return false;
}
return true;
}
}
const string HeartBeatEnding = "<ChannelHeartBeat xmlns=\"http://schema.broadsoft.com/xsi\"/>";
const string EventEnding = "</xsi:Event>";
char c = (char)streamReader.Read();
sb.Append(c);
if (sb.EndsWith(EventEnding)) {
// do stuff
}
else if (sb.EndsWith(HeartBeatEnding)) {
// do stuff
}