一位同事今天告诉我,在ascx.cs上使用foreach和String Builder构建整个字符串会更快(所以,在字符串中编写html代码)并在ascx末尾发布它为<%=myStringGenerateByStringBuilder%>
,而不是直接在ascx上使用foreach,例如:
<% foreach (var thing in things)
{ %>
<div><p><%= thing.Description %></p></div>
<% }; %>
这是因为开放<%
和关闭%>
非常昂贵。
这是真的吗?我没有谈论管理代码(第二个approch是我使用的,非常简洁),我谈论生成代码时的性能。
答案 0 :(得分:2)
您需要在实际网站中对此进行测试才能确定,因为有很多因素。
答案 1 :(得分: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)
然而,我有疑问有人会在网页上写出数十亿字符串。 对于较小的列表,没有区别。 即使我设置StringBuilder的容量,它仍然会更慢。所以是的,使用HtmlTextWriter直接编写许多小字符串比从这些字符串构建字符串然后编写它更快。
答案 2 :(得分:1)
<%= x %>
被编译为对TextWriter的调用,后者有一些开销。首先构建一个更大的字符串更快是合理的。反之亦然。
这需要在没有测量的任何猜测下进行测量。
答案 3 :(得分:0)
你的同事是对的,我尝试了同样的工作(例如我在文字中添加了文字)。我使用Stringbuilder和foreach创建了字符串,只有在添加到word后才能更快地工作,然后当我尝试在foreach中添加字符串时。
答案 4 :(得分:0)
此外,还取决于该网站是否已预先编译。
更重要的问题恕我直言,缺乏可维护性,将介绍移到后面的代码中。例如,如果我必须向div添加一个类,我不应该去后面的代码来执行此操作。