代码之家  ›  专栏  ›  技术社区  ›  Eray Balkanli

在C语言中将包含大量数据的数据表转换为HTML时出现性能问题#

  •  0
  • Eray Balkanli  · 技术社区  · 6 年前

    我在C中有一个函数,如下所示:

    public static string ConvertDataTableToHTMLExtra(DataTable dt)
        {
            string html = "";
                html += "<table>";
    
                //add header row
                html += "<thead>";
                html += "<tr>";
                for (int i = 0; i < dt.Columns.Count; i++)
                    html += "<td>" + dt.Columns[i].ColumnName + "</td>";
                html += "</tr>";
                html += "</thead>";
    
                //add rows
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    html += "<tr>";
                    for (int j = 0; j < dt.Columns.Count; j++)
                        html += "<td>" + dt.Rows[i][j].ToString() + "</td>";
                    html += "</tr>";
                }
    
                html += "</table>";
    
            return html;
        }
    

    使用存储过程填充数据表。将内容设置为dt后,调用上面的函数。它工作有点慢,但没有错误,只要我们有不到6000行。在~6000以上,返回超时错误。SP的执行时间仍小于2秒。

    有没有更好的方法来重新开发这种功能?如有任何帮助或建议,我们将不胜感激。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Ousmane D.    6 年前

    有没有更好的方法来重新开发这种功能?任何帮助或 建议将不胜感激。

    是的,我建议您开始重构代码以使用 StringBuilder 而不是 String 因为循环中的字符串连接相当昂贵。

    Using the StringBuilder Class in .NET :

    字符串对象是不可变的。每次你使用其中一种方法 在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();
    }