3

今天的一位同事告诉我,在 ascx.cs 中使用 foreach 和 String Builder 更快地构建整个字符串(因此,在字符串中编写 html 代码)并将其最后发布在 ascx as 上<%=myStringGenerateByStringBuilder%>,而不是直接在 ascx 上使用 foreach , 如 :

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

这是因为打开<%和关闭%>非常昂贵。

这是真的吗?我不谈论管理代码(第二个方法是我使用的,非常干净和容易),我谈论生成代码的性能。

4

5 回答 5

2

您需要在现场进行测试才能确定,因为有很多因素。

  • 请记住,您不一定只是构建一个字符串并将其返回给浏览器。
  • 如果您正在构建一个大文件,您可能会受益于 asp.net 的流式传输功能。
于 2012-04-20T14:22:06.687 回答
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)

在此处输入图像描述

但是,我怀疑有人会在网页中编写 20 亿个字符串。对于较小的列表,没有区别。即使我设置了 StringBuilder 的容量,它仍然会更慢。所以是的,使用 HtmlTextWriter 直接编写许多小字符串会比从这些字符串构建一个字符串然后编写它要快。

于 2012-04-20T14:56:25.623 回答
1

<%= x %>被编译为对有一些开销的 TextWriter 的调用。首先构建更大的字符串更快是合理的。反之亦然。

这需要测量任何没有测量的猜测都是没有根据的。

于 2012-04-20T14:23:55.290 回答
0

你的同事是对的,我尝试了同样的工作(例如,我在 word 中添加了文本)。我使用 Stringbuilder 和 foreach 制作了字符串,并且只有在添加到 word 之后它才能更快地工作,然后我尝试在 foreach 中添加字符串。

于 2012-04-20T14:24:48.990 回答
0

此外,这取决于该站点是否已预编译。

恕我直言,更重要的问题是缺乏可维护性,这将通过将演示文稿移到后面的代码来引入。例如,如果我必须向 div 添加一个类,我不应该去后面的代码来执行此操作。

于 2012-04-20T14:25:58.150 回答