[英]How can i optimize this c# code?
我已经使用以下方法将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();
}
这足够公平还是仍然有优化的余地,以使其执行更快。...任何建议...
也许有很多方法可以使其更快地执行-但是您是否有迹象表明需要它更快地执行? 您是否有充分的理由相信这是代码中的重要瓶颈? 如果是这样,请使用一些实际数据对代码进行基准测试,并分析例程以弄清楚时间的流逝。
在询问是否可以对其进行优化以使其更快地执行之前,您需要问自己的第一个问题是,它对我来说足够快地运行吗? 过早的优化是我们所有人的诅咒(我知道我已经做到了!)。 您可能需要花费数小时来尝试对该代码进行微优化,例如,可能需要20毫秒才能执行到15毫秒。 是的,这将减少25%,但是5毫秒真的值2小时的时间吗? 更重要的是,它将为您的最终用户提供足够的利益以保证它吗?
您是否考虑过使用“ Newtonsoft”中的JsonSerializer ? 这可能“足够快”,已被广泛使用,因此比我或您第一次可以写的任何东西总体上更正确。
纯粹从可读性的角度(这也可能允许C#编译器/ CLR为您改进),您可以考虑更改长字符串串联,例如:
HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\",";
至:
HeadStr += string.Format("\"{0}\" : \"{0}{1}¾\",", strDc[i], i);
但是对于您所做的任何更改。 测量,冲洗,重复=)
您可以整理一下:
string.Format()
避免长的x + y + z
序列。 这可能会或可能不会使事情变得更快(无论哪种方式都很少)。 .toString()
。 您还可以传入要填充的StringBuffer
,以便调用者可以将多个此类操作捆绑为一个StringBuffer
。
这些建议更多地关注整理而不是性能,我认为这应该是真正的关注点,除非此代码在性能分析中成为瓶颈。
您为什么认为它需要优化? 在某些数据表上真的很慢吗? 如果只是可序列化的话,我将使用诸如Newton JSON序列化器之类的数据表进行序列化。
重构代码,使用ReSharper,JustCode等工具整理一下代码。 提取方法并使用单个测试(Test Driven Development-ish)在代码中找到瓶颈,然后进行调整。
但是您的第一步应该是: 重构!
代码的问题不是速度,而是没有清理。 我已经做了一些清理工作,但是您可能可以做更多的事情:
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();
}
如果您使用的是.net 3.0或3.5,我建议使用其他解决方案
而不是这样做
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.