我该如何优化这个c#代码?

时间:2010-03-30 07:37:05

标签: c# optimization

我已将Datatable转换为json字符串,请使用以下方法...

public string GetJSONString(DataTable Dt)
{
    string[] StrDc = new string[Dt.Columns.Count];
    string HeadStr = string.Empty;
    for (int i = 0; i < Dt.Columns.Count; i++)
    {
        StrDc[i] = Dt.Columns[i].Caption;
        HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\",";
    }
    HeadStr = HeadStr.Substring(0, HeadStr.Length - 1);
    StringBuilder Sb = new StringBuilder();

    Sb.Append("{\"" + Dt.TableName + "\" : [");
    for (int i = 0; i < Dt.Rows.Count; i++)
    {
        string TempStr = HeadStr;
        Sb.Append("{");
        for (int j = 0; j < Dt.Columns.Count; j++)
        {
            if (Dt.Rows[i][j].ToString().Contains("'") == true)
            {
                Dt.Rows[i][j] = Dt.Rows[i][j].ToString().Replace("'", "");
            }
            TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "¾", Dt.Rows[i][j].ToString());
        }
        Sb.Append(TempStr + "},");
    }
    Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1));
    Sb.Append("]}");
    return Sb.ToString();
}

这是否足够公平,或者仍然存在优化余地,以使其执行得更快......任何建议......

7 个答案:

答案 0 :(得分:4)

可能有办法让它更快地执行 - 但你有没有迹象表明你需要它执行得更快?你有充分的理由相信这是你代码中的一个重要瓶颈吗?如果是这样,请使用一些实际数据对代码进行基准测试,并对例程进行分析,以确定时间的进展。

答案 1 :(得分:4)

在询问您是否可以优化它以使其更快地执行之前,您需要问自己的第一个问题是,它对我来说运行得足够快吗?过早的优化是我们所有人的诅咒(我知道我已经完成了!)。你可能花费数小时试图对这段代码进行微优化,这可能会使它从例如20ms执行到15ms。是的,这将减少25%,但5ms真的值2小时的时间吗?更重要的是,它能为您的最终用户提供足够的好处吗?

您是否考虑过使用JsonSerializer from "Newtonsoft"?这可能是“足够快”,使用得相当广泛,因此整体上比我或你可以第一次写的任何东西都更正确。

纯粹从可读性的角度来看(也可能允许C#编译器/ CLR为你改进)你可以考虑改变字符串连接的长位,例如:

HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\",";

要:

HeadStr += string.Format("\"{0}\" : \"{0}{1}¾\",", strDc[i], i);

但是对于你所做的任何改变。测量,冲洗,重复=)

答案 2 :(得分:1)

你可以收拾一些东西:

  1. 使用string.Format()来避免长x + y + z个序列。这可能会或可能不会使事情变得更快(无论哪种方式都是边缘的)。
  2. 连接时通常不需要.toString()
  3. 您还可以传入要填充的StringBuffer,以便调用者可以将多个此类操作捆绑到一个StringBuffer中。

    这些建议更侧重于整洁而不是性能,我认为这应该是真正的焦点,除非此代码在您的分析中被视为瓶颈。

答案 3 :(得分:0)

为什么你认为它需要优化?某些DataTables真的很慢吗? 我只是用Newton JSON序列化器来序列化DataTable,如果它可以序列化的话。

答案 4 :(得分:0)

重构您的代码,使用像ReSharper,JustCode等工具来整理它。提取方法并使用单独的测试(Test Driven Development-ish)来查找代码中的瓶颈,然后进行调整。

但你的第一步应该是:重构!

答案 5 :(得分:0)

代码的问题不是速度,而是它没有清理。我做了一些清理,但你可能会做更多的事情:

public string GetJSONString2(DataTable table)
{
    StringBuilder headStrBuilder = new StringBuilder(table.Columns.Count * 5); //pre-allocate some space, default is 16 bytes
    for (int i = 0; i < table.Columns.Count; i++)
    {
        headStrBuilder.AppendFormat("\"{0}\" : \"{0}{1}¾\",", table.Columns[i].Caption, i);
    }
    headStrBuilder.Remove(headStrBuilder.Length - 1, 1); // trim away last ,

    StringBuilder sb = new StringBuilder(table.Rows.Count * 5); //pre-allocate some space
    sb.Append("{\"");
    sb.Append(table.TableName);
    sb.Append("\" : [");
    for (int i = 0; i < table.Rows.Count; i++)
    {
        string tempStr = headStrBuilder.ToString();
        sb.Append("{");
        for (int j = 0; j < table.Columns.Count; j++)
        {
            table.Rows[i][j] = table.Rows[i][j].ToString().Replace("'", "");
            tempStr = tempStr.Replace(table.Columns[j] + j.ToString() + "¾", table.Rows[i][j].ToString());
        }
        sb.Append(tempStr + "},");
    }
    sb.Remove(sb.Length - 1, 1); // trim last ,
    sb.Append("]}");
    return sb.ToString();
}

答案 6 :(得分:-2)

如果您使用.net 3.0或3.5

,我建议使用不同的解决方案

而不是这样做

  1. 将数据表转换为xml
  2. 使用xmlserializer将xml转换为域对象
  3. 使用JavaScriptSerializer(System.Web.Extensions.dll)将域对象序列化为json字符串。