【发布时间】:2013-09-06 19:47:13
【问题描述】:
我有执行此操作的 C# 代码:
// This returns 10,000 rows quite quickly, but displaying them below is slow
DataTable dt = GetUsageStats();
string html = "<table>";
// This part is really slow
foreach (DataRow dr in dt.Rows)
{
html += "<tr>";
html += "<td>" + dr["column1"].ToString() + "</td>";
html += "<td>" + dr["column2"].ToString() + "</td>";
...
html += "<td>" + dr["column5"].ToString() + "</td>";
html += "</tr>";
}
html += "</table>";
由于有 10,000 条左右的记录,foreach 变得如此缓慢。有没有什么机制可以加快这个过程?
谢谢!
【问题讨论】:
-
在这样的循环中连接字符串是一个 O(N^2) 操作,因为内存的逐步重新分配。
StringBuilder使用一个列表来保存指向源字符串的指针,直到您需要输出/结果字符串,然后它会立即分配所有空间,使其成为 O(N) 操作。跨度> -
附注:如果您的某个数据包含例如
</body>怎么办? -
将其添加为评论,因为它不会直接回答您的问题,但是,您真的不想这样做,确保使用 stringbuilder 服务器端会运行得很快,但在大多数浏览器上&终端设备在表格中显示 10 000 行将非常慢,甚至超过页面加载。我强烈建议您不要将自己限制在 10K 行,而只需在最终用户滚动时加载 100 行并使用 ajax 异步加载(或者,如果您想一次显示所有内容,请从 Web 应用程序切换到 WPF由于虚拟化,应用程序将立即显示数百万个项目)
-
有点离题:取决于它是什么以及它来自哪里,您可能想要对数据进行 HtmlEncode。
标签: c# .net sql performance .net-3.5