3

<%=myStringGenerateByStringBuilder%>今日の同僚は、ascxで foreach を直接使用するよりも、foreach と String Builder を使用して ascx.cs で文字列全体をビルドし (したがって、文字列に html コードを記述して)、ascx の最後に as として投稿する方が速いと教えてくれました。、 そのような :

<% foreach (var thing in things)
   { %>
   <div><p><%= thing.Description %></p></div>
<% }; %>

これは<%、開閉%>が非常に高価であるためです。

本当ですか?コードの管理については触れません (私が使用する 2 番目のアプローチは非常にクリーンで簡単です)。コードを生成する際のパフォーマンスについて話します。

4

5 に答える 5

2

さて、いくつかのテスト:

void Main()
{
    var things = Enumerable
            .Range(1, 2000000)
            .Select(r => new Thing {Description = r.ToString()})
            .ToList();

    var times = Enumerable.Range(1, 10)
        .Select(t => new
            {   
                Method1 = Test(Method1, things),
                Method2 = Test(Method2, things),
            }
    ).ToList();
    var average = new {
            Method1 = TimeSpan.FromMilliseconds( times.Sum(t=>t.Method1.TotalMilliseconds) / times.Count),
            Method2 = TimeSpan.FromMilliseconds( times.Sum(t=>t.Method2.TotalMilliseconds) / times.Count),
    };
    average.Dump();
}

public TimeSpan Test(Action<IEnumerable<Thing>> action, IEnumerable<Thing> things)
{
    var stopWatch = new Stopwatch();
    stopWatch.Start();
    action(things);
    stopWatch.Stop();
    return stopWatch.Elapsed;
}

public void Method1(IEnumerable<Thing> things)
{
    var sb = new StringBuilder();
    using (var stringWriter = new StringWriter(sb) )
    {
        using (var htmlWriter = new HtmlTextWriter(stringWriter))
        {                   
            foreach (var thing in things)
            {
                htmlWriter.Write(thing.Description);
            }
        }
    }   
}


public void Method2(IEnumerable<Thing> things)
{
    var thingsBuilder = new StringBuilder();
    foreach ( var thing in things)
        thingsBuilder.Append(thing.Description);
    var thingsText = thingsBuilder.ToString();
    var sb = new StringBuilder();
    using (var stringWriter = new StringWriter(sb) )
    {
        using (var htmlWriter = new HtmlTextWriter(stringWriter))
        {           
            htmlWriter.Write(thingsText);                   
        }
    }   
}

public class Thing
{
    public string Description {get; set;}
}
// Define other methods and classes here

(use linq pad)

ここに画像の説明を入力

しかし、誰かが Web ページに 20 億の文字列を書き込むとは思えません。小さいリストの場合、違いはありません。StringBuilder の Capacity を設定しても、それでも遅くなります。そうです、HtmlTextWriter を使用して多数の小さな文字列を直接書き込むと、それらの文字列から文字列を作成してから書き込むよりも高速になります。

于 2012-04-20T14:56:25.623 に答える
2

多くの要因があるため、実際のサイトでこれをテストして確認する必要があります。

  • 必ずしも文字列を作成してブラウザに返すだけではないことに注意してください。
  • 大きなファイルを作成する場合は、asp.net のストリーミング機能を利用できます。
于 2012-04-20T14:22:06.687 に答える
1

<%= x %>オーバーヘッドのある TextWriter への呼び出しにコンパイルされます。最初に大きな文字列を構築する方が高速であることはもっともらしいです。反対もそうです。

これは測定する必要があり、測定なしでこれに関する推測は根拠がありません。

于 2012-04-20T14:23:55.290 に答える
0

あなたの同僚は正しかった、私は同じ作業を試みました (たとえば、単語でテキストを追加しました)。Stringbuilder と foreach を使用して文字列を作成しましたが、単語に追加した後でのみ、foreach に文字列を追加しようとしたときよりも高速に動作します。

于 2012-04-20T14:24:48.990 に答える
0

また、サイトが事前にコンパイルされているかどうかによっても異なります。

私見のより重要な問題は、プレゼンテーションをコードビハインドに移動することによって導入される保守性の欠如です。たとえば、クラスを div に追加する必要がある場合、これを行うためにコード ビハインドに移動する必要はありません。

于 2012-04-20T14:25:58.150 に答える