首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >字符串输出: C#中的format还是concat?

字符串输出: C#中的format还是concat?
EN

Stack Overflow用户
提问于 2008-08-19 15:46:54
回答 30查看 98.2K关注 0票数 183

假设您想要输出或连接字符串。你更喜欢以下哪一种风格?

  • var p = new { FirstName = "Bill", LastName = "Gates" };
  • Console.WriteLine("{0} {1}", p.FirstName, p.LastName);
  • Console.WriteLine(p.FirstName + " " + p.LastName);

你更愿意使用格式,还是简单地连接字符串?你最喜欢的是什么?是不是其中一个伤到你的眼睛了?

你有什么合理的论据来使用一个而不是另一个吗?

我会选择第二个。

EN

回答 30

Stack Overflow用户

发布于 2008-08-23 20:07:14

令我惊讶的是,这么多人立即想要找到执行速度最快的代码。如果一百万次迭代仍然需要不到一秒的时间来处理,那么最终用户是否会注意到这一点?不太可能。

过早优化=失败。

我选择String.Format,只是因为从架构的角度来看,它是最有意义的。我并不关心性能,直到它成为一个问题(如果是的话,我会问自己:我需要一次连接一百万个名字吗?当然,它们不会全部显示在屏幕上...)

考虑一下,如果您的客户以后想要更改它,以便他们可以使用Format选项配置是显示"Firstname Lastname"还是"Lastname, Firstname.",这很简单-只需交换出格式字符串。使用concat,您将需要额外的代码。当然,在这个特定的例子中,这听起来不是什么大问题,但可以推断一下。

票数 161
EN

Stack Overflow用户

发布于 2008-08-20 08:45:20

哦,天哪-在读完另一个回复后,我试着颠倒了操作的顺序-所以首先执行连接,然后执行String.Format...

代码语言:javascript
复制
Bill Gates
Console.WriteLine(p.FirstName + " " + p.LastName); took: 8ms - 30488 ticks
Bill Gates
Console.WriteLine("{0} {1}", p.FirstName, p.LastName); took: 0ms - 182 ticks

因此,操作的顺序有很大的不同,或者更确切地说,第一个操作总是慢得多。

以下是多次完成操作的运行结果。我试过改变顺序,但通常遵循相同的规则,一旦第一个结果被忽略:

代码语言:javascript
复制
Bill Gates
Console.WriteLine(FirstName + " " + LastName); took: 5ms - 20335 ticks
Bill Gates
Console.WriteLine(FirstName + " " + LastName); took: 0ms - 156 ticks
Bill Gates
Console.WriteLine(FirstName + " " + LastName); took: 0ms - 122 ticks
Bill Gates
Console.WriteLine("{0} {1}", FirstName, LastName); took: 0ms - 181 ticks
Bill Gates
Console.WriteLine("{0} {1}", FirstName, LastName); took: 0ms - 122 ticks
Bill Gates
String.Concat(FirstName, " ", LastName); took: 0ms - 142 ticks
Bill Gates
String.Concat(FirstName, " ", LastName); took: 0ms - 117 ticks

正如您所看到的,相同方法(我将代码重构为3个方法)的后续运行速度会逐渐加快。最快的似乎是Console.WriteLine(String.Concat(...))方法,然后是正常连接,然后是格式化操作。

启动的初始延迟很可能是控制台流的初始化,因为放置了一个Console.Writeline("Start!")在第一次操作之前,所有时间都会恢复到原来的水平。

票数 54
EN

Stack Overflow用户

发布于 2012-11-13 09:13:15

字符串是不可变的,这意味着在您的代码中反复使用相同的一小块内存。将相同的两个字符串添加在一起并一遍又一遍地创建相同的新字符串不会影响内存。.Net足够智能,可以使用相同的内存引用。因此,您的代码并没有真正测试这两个concat方法之间的区别。

试试这件衣服的尺寸:

代码语言:javascript
复制
Stopwatch s = new Stopwatch();

int n = 1000000;
long fElapsedMilliseconds = 0, fElapsedTicks = 0, cElapsedMilliseconds = 0, cElapsedTicks = 0, sbElapsedMilliseconds = 0, sbElapsedTicks = 0;

Random random = new Random(DateTime.Now.Millisecond);

string result;
s.Start();
for (var i = 0; i < n; i++)
    result = (random.Next().ToString() + " " + random.Next().ToString());
s.Stop();
cElapsedMilliseconds = s.ElapsedMilliseconds;
cElapsedTicks = s.ElapsedTicks;
s.Reset();

s.Start();
for (var i = 0; i < n; i++)
    result = string.Format("{0} {1}", random.Next().ToString(), random.Next().ToString());
s.Stop();
fElapsedMilliseconds = s.ElapsedMilliseconds;
fElapsedTicks = s.ElapsedTicks;
s.Reset();

StringBuilder sb = new StringBuilder();
s.Start();
for(var i = 0; i < n; i++){
    sb.Clear();
    sb.Append(random.Next().ToString());
    sb.Append(" ");
    sb.Append(random.Next().ToString());
    result = sb.ToString();
}
s.Stop();
sbElapsedMilliseconds = s.ElapsedMilliseconds;
sbElapsedTicks = s.ElapsedTicks;
s.Reset();

Console.WriteLine(n.ToString() + " x result = string.Format(\"{0} {1}\", p.FirstName, p.LastName); took: " + (fElapsedMilliseconds) + "ms - " + (fElapsedTicks) + " ticks");
Console.WriteLine(n.ToString() + " x result = (p.FirstName + \" \" + p.LastName); took: " + (cElapsedMilliseconds) + "ms - " + (cElapsedTicks) + " ticks");
Console.WriteLine(n.ToString() + " x sb.Clear();sb.Append(random.Next().ToString()); sb.Append(\" \"); sb.Append(random.Next().ToString()); result = sb.ToString(); took: " + (sbElapsedMilliseconds) + "ms - " + (sbElapsedTicks) + " ticks");
Console.WriteLine("****************");
Console.WriteLine("Press Enter to Quit");
Console.ReadLine();

示例输出:

代码语言:javascript
复制
1000000 x result = string.Format("{0} {1}", p.FirstName, p.LastName); took: 513ms - 1499816 ticks
1000000 x result = (p.FirstName + " " + p.LastName); took: 393ms - 1150148 ticks
1000000 x sb.Clear();sb.Append(random.Next().ToString()); sb.Append(" "); sb.Append(random.Next().ToString()); result = sb.ToString(); took: 405ms - 1185816 ticks
票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档