【问题标题】:Improving processing speed of a large SQL table in C#提高 C# 中大型 SQL 表的处理速度
【发布时间】: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) 操作。跨度>
  • 附注:如果您的某个数据包含例如&lt;/body&gt; 怎么办?
  • 将其添加为评论,因为它不会直接回答您的问题,但是,您真的不想这样做,确保使用 stringbuilder 服务器端会运行得很快,但在大多数浏览器上&终端设备在表格中显示 10 000 行将非常慢,甚至超过页面加载。我强烈建议您不要将自己限制在 10K 行,而只需在最终用户滚动时加载 100 行并使用 ajax 异步加载(或者,如果您想一次显示所有内容,请从 Web 应用程序切换到 WPF由于虚拟化,应用程序将立即显示数百万个项目)
  • 有点离题:取决于它是什么以及它来自哪里,您可能想要对数据进行 HtmlEncode。

标签: c# .net sql performance .net-3.5


【解决方案1】:

你想使用StringBuilder

var sb = new StringBuilder();
for(int i=0; i<10000; i++)
{
    sb.Append("somestring");
}
string myString = sb.ToString();

字符串是不可变的。每次将两个字符串连接在一起时,都必须将整个结果写入内存。 StringBuilder 提供了一种可变的方式来处理字符串,并在某些情况下提供了很大的性能提升。

【讨论】:

  • 很好的解决方案,解释一下原因会很有用
  • @jdphenix 谢谢。我添加了一个简短的解释。
【解决方案2】:

StringBuilder 类的救援

StringBuilder bb = new StringBuilder();

bb.Append("string1");
bb.Append("string2");
bb.Append("string3");

string result = bb.ToString();

StringBuilder() 旨在被修改。字符串是不可变的,因此每次修改时都会从 scatch 重新创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    相关资源
    最近更新 更多