3

+ =(:()を使用する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;
        }
4

3 に答える 3

7

を使用するStringBuilderと、パフォーマンスが向上するはずです。

「文字列の可変文字列を表す」ため、文字列を毎回コピーする必要がないため、文字列を直接連結するよりも文字列操作がはるかに高速です。

于 2010-11-17T08:55:52.043 に答える
4

最善の方法は、最初に文字列の連結を使用しないことです、IMO。XMLAPIを使用します。またはを作成XDocumentし、最後にそれを文字列にXmlDocument変換ます。現時点ではロジックはかなり単純ですが、エスケープなどが必要な値が必要になるとすぐに、実際のXMLAPIのすべてのロジックを複製する必要はありません...既存のロジックを使用してください。

現在のメソッドを書き直す方法の例を次に示します。

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は確かに行く方法です。

于 2010-11-17T09:12:38.173 に答える
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の方が速い場合もあれば、かなり遅い場合もあります。明らかなことは、文字列の使用は比較してはるかに遅いということです。

于 2010-11-17T09:30:38.070 に答える