我在C#中具有如下功能:
Set
通过使用存储过程来填充数据表。内容设置为dt后,将调用上面的函数。只要我们的行数少于6000,它的工作速度就会变慢但没有错误。高于〜6000,则返回超时错误。 SP的执行时间还不到2秒。
是否有更好的方法来重新开发这种功能?任何帮助或建议,将不胜感激。
答案 0 :(得分:2)
是否有更好的方法来重新开发这种功能?任何帮助或 建议将不胜感激。
是的,我建议您开始重构代码以使用StringBuilder
而不是String
,因为循环中的字符串连接相当昂贵。
Using the StringBuilder Class in .NET:
String对象是不可变的。每次您使用其中一种方法 在System.String类中,您可以在内存中创建一个新的字符串对象, 这需要为该新对象分配新的空间。在 您需要对某项进行重复修改的情况 字符串,与创建新的String对象相关的开销可以 代价高昂。当您使用System.Text.StringBuilder类时,可以使用 想要修改字符串而不创建新对象。例如, 连接时使用StringBuilder类可以提高性能 许多字符串一起循环。
因此,该方法如下所示:
static string ConvertDataTableToHTMLExtra(DataTable dt)
{
StringBuilder html = new StringBuilder();
html.Append("<table>");
//add header row
html.Append("<thead>");
html.Append("<tr>");
for (int i = 0; i < dt.Columns.Count; i++)
html.Append("<td>").Append(dt.Columns[i].ColumnName).Append("</td>");
html.Append("</tr>");
html.Append("</thead>");
//add rows
for (int i = 0; i < dt.Rows.Count; i++)
{
html.Append("<tr>");
for (int j = 0; j < dt.Columns.Count; j++)
html.Append("<td>").Append(dt.Rows[i][j]).Append("</td>");
html.Append("</tr>");
}
html.Append("</table>");
return html.ToString();
}