C# 为什么这个循环这么慢?
我试图寻找一个原因来解释为什么这个循环如此缓慢,但我还没有得到一个好的答案。执行以下循环需要一分钟:C# 为什么这个循环这么慢?,c#,performance,loops,C#,Performance,Loops,我试图寻找一个原因来解释为什么这个循环如此缓慢,但我还没有得到一个好的答案。执行以下循环需要一分钟: string answer = ""; string headers = ""; string datarows = ""; bool firstRun = true; foreach (Dictionary<string, string> row in JSON) {
string answer = "";
string headers = "";
string datarows = "";
bool firstRun = true;
foreach (Dictionary<string, string> row in JSON)
{
datarows += "<tr>";
foreach (KeyValuePair<String, String> cell in row)
{
if (firstRun) { headers += "<th>" + cell.Key + "</th>"; }
datarows += "<td>" + cell.Value + "</td>";
}
datarows += "</tr>";
firstRun = false;
}
answer += "<table><tr>" + headers + "</tr>" + datarows + "</table>";
return answer;
string-answer=“”;
字符串标题=”;
字符串datarows=“”;
bool firstRun=true;
foreach(JSON中的字典行)
{
数据行+=“”;
foreach(行中的KeyValuePair单元格)
{
if(firstRun){headers+=“”+cell.Key+“”;}
数据行+=“”+单元格.值+“”;
}
数据行+=“”;
firstRun=false;
}
答案+=“”+标题+“”+数据行+“”;
返回答案;
JSON变量是一个列表,包含大约1150个字典。每个字典包含9个键值对。有什么想法吗?最明显的问题是字符串连接 每次附加到字符串时,实际上是在附加到字符串的副本(因为每个字符串都是不可变的)。这可能非常昂贵
您应该选择a,或者,对于生成这样的HTML,您可能需要研究-这将有助于处理HTML的“格式良好”等问题。出现的明显问题是字符串连接 每次附加到字符串时,实际上是在附加到字符串的副本(因为每个字符串都是不可变的)。这可能非常昂贵 您应该选择a,或者,对于生成这样的HTML,您可能需要研究-这将有助于处理HTML的“格式良好”等问题。尝试使用a而不是手动连接字符串 按照您的操作方式,每次向字符串末尾添加更多内容时,都会重新计算字符串,每次都会重新生成字符串,这是非常昂贵的。StringBuilder对于这种类型的工作效率要高得多。尝试使用字符串而不是手动连接字符串
按照您的操作方式,每次向字符串末尾添加更多内容时,都会重新计算字符串,每次都会重新生成字符串,这是非常昂贵的。StringBuilder在这类工作中效率更高。每当您附加到字符串时,旧字符串将被销毁,新字符串将被创建 所以你放的越多,字符串的凝聚速度就越慢
如果使用StringBuilder,速度应该会快得多。每当附加到字符串时,旧字符串将被销毁,新字符串将被创建 所以你放的越多,字符串的凝聚速度就越慢
如果您换用StringBuilder,速度应该会快得多。您是否尝试将字符串类型更改为必须连接的StringBuilder
StringBuilder answer=new StringBuilder();
StringBuilder标头=新的StringBuilder();
StringBuilder datarows=新建StringBuilder();
bool firstRun=true;
foreach(JSON中的字典行)
{
datarows.Apeend(“”);
foreach(行中的KeyValuePair单元格)
{
if(firstRun){headers.Apeend(“+cell.Key+”);}
datarows.Append(“+cell.Value+”);
}
datarows.Append(“”);
firstRun=false;
}
答案。追加(“+标题+”+数据行+”);
返回response.toString();
是否尝试将字符串类型更改为必须连接的StringBuilder
StringBuilder answer=new StringBuilder();
StringBuilder标头=新的StringBuilder();
StringBuilder datarows=新建StringBuilder();
bool firstRun=true;
foreach(JSON中的字典行)
{
datarows.Apeend(“”);
foreach(行中的KeyValuePair单元格)
{
if(firstRun){headers.Apeend(“+cell.Key+”);}
datarows.Append(“+cell.Value+”);
}
datarows.Append(“”);
firstRun=false;
}
答案。追加(“+标题+”+数据行+”);
返回response.toString();
您是否尝试过StringBuilder是否有帮助?我建议您使用StringBuilder而不是字符串连接。它不会解决所有的性能问题,但它也可以帮助if(firstrun)在每个迭代中运行,但仅用于第一个。对JSON的调用是否会调用网络调用?对于9*1k,这肯定是字符串上的+=
存在问题的领域。您是否尝试过StringBuilder是否有帮助?我建议您使用StringBuilder而不是字符串连接。它不会解决所有的性能问题,但它也可以帮助if(firstrun)在每次迭代中运行,但只在第一次迭代中使用。对JSON的调用是否会调用网络调用?对于9*1k,这肯定是字符串上的+=
问题所在。感谢大家的快速反馈!从现在起,我会记得使用字符串生成器。感谢大家的快速反馈!从现在起,我将记住使用字符串生成器。
StringBuilder answer = new StringBuilder();
StringBuilder headers = new StringBuilder();
StringBuilder datarows = new StringBuilder();
bool firstRun = true;
foreach (Dictionary<string, string> row in JSON)
{
datarows .Apeend("<tr>");
foreach (KeyValuePair<String, String> cell in row)
{
if (firstRun) { headers.Apeend("<th>" + cell.Key + "</th>"); }
datarows.Append("<td>" + cell.Value + "</td>");
}
datarows.Append("</tr>");
firstRun = false;
}
answer.Append("<table><tr>" + headers + "</tr>" + datarows + "</table>");
return answer.toString();