嘿伙计们 - 有个问题。
我们有一个使用+ =(:()
的XMLIDList助手我正在寻找的是最快的方法。这不是一个问题,因为列表已经有< 10项,但我们添加了一个新功能,可以传递15k项目,你可以想象..它的狗很慢!
public static string EncodeGuidListToXML(IList<Guid> elementsToEncode)
{
if (elementsToEncode == null || elementsToEncode.Count == 0)
return String.Empty;
string beginItemNode = BeginItemNode;
string endItemNode = EndItemNode;
string xml = BeginRootNode;
foreach (Guid item in elementsToEncode)
{
xml += beginItemNode + item.ToString().ToUpper() + endItemNode;
}
xml += EndRootNode;
return xml;
}
感谢。
答案 0 :(得分:7)
使用StringBuilder
可以带来一些性能改进。
因为它“代表一个可变的字符串”,它在字符串操作上比直接连接字符串要快得多,因为它不必每次都复制字符串
答案 1 :(得分:4)
最好的方法是不要使用字符串连接来开始,IMO。使用XML API。构建XDocument
或XmlDocument
,然后将 转换为字符串。虽然你的逻辑目前相当简单,但只要你开始需要转义或需要转义的值,你真的不想复制真正的XML API的所有逻辑......所以使用现有的
以下是如何重写当前方法的示例:
public static string EncodeGuidListToXml(IList<Guid> guids)
{
if (elementsToEncode == null || elementsToEncode.Count == 0)
{
return "";
}
return new XDocument(
new XElement("Root",
guids.Select(guid => new XElement("Item", guid.ToString().ToUpper()))
)).ToString();
}
如果真的想要坚持直接构建字符串,StringBuilder
确实是可行的方法。
答案 2 :(得分:3)
我使用标准字符串方法,StringBuilder类方法和使用XDocument和XElement类的方法运行了一些测试。使用短列表获得了StringBuilder类,但是对于更大的列表,XML类给出了相似的时间。我使用的测试代码如下:
List<string> list;
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
protected void Page_Load(object sender, EventArgs e)
{
list = Enumerable.Range(0, 15000).Select(i => i.ToString()).ToList();
UsingStrings();
UsingStringBuilder();
UsingXDocument();
}
private void UsingStrings()
{
timer.Reset();
timer.Start();
string beginItemNode = "<Node>";
string endItemNode = "</Node>";
string xml = "<Root>";
foreach (string item in list)
{
xml += beginItemNode + item + endItemNode;
}
xml += "</Root>";
timer.Stop();
Response.Write(string.Format("Strings time:{0}<br />", timer.Elapsed.Ticks));
}
private void UsingStringBuilder()
{
timer.Reset();
timer.Start();
StringBuilder sb = new StringBuilder();
sb.Append("<Root>");
foreach (string item in list)
{
sb.AppendFormat("<Node>{0}</Node>", item);
}
sb.Append("</Root>");
timer.Stop();
Response.Write(string.Format("StringBuilder time:{0}<br />", timer.Elapsed.Ticks));
}
private void UsingXDocument()
{
timer.Reset();
timer.Start();
XDocument xDoc = new XDocument();
xDoc.Add(new XElement("Root"));
foreach (var item in list)
{
XElement element = new XElement("Node", item);
xDoc.Root.Add(element);
}
timer.Stop();
Response.Write(string.Format("XDocument time:{0}<br />", timer.Elapsed.Ticks));
}
上述测试在我的机器上给出了以下结果:
First run:
Strings time:239750613
StringBuilder time:55509
XDocument time:61904
Second run:
Strings time:289422753
StringBuilder time:198595
XDocument time:80032
如果要将XDocument XML显示为字符串而不使用格式:
string xml = xDoc.ToString(SaveOptions.DisableFormatting);
编辑:我最初说XDocument要快得多,但运行测试几次似乎它通常等同于StringBuilder方法,虽然它似乎更一致,而有时StringBuilder更快,其他时候慢一点。显而易见的是,使用字符串相比要慢得多。