使用常量进行字符串连接 - 性能

发布于 2024-10-20 04:03:02 字数 611 浏览 4 评论 0原文

假设我有以下字符串常量:

const string constString1 = "Const String 1";
const string constString2 = "Const String 2";
const string constString3 = "Const String 3";
const string constString4 = "Const String 4";

现在我可以通过两种方式附加字符串: 选项1:

string resultString = constString1 + constString2 + constString3 + constString4;

选项2:

string resultString = string.Format("{0}{1}{2}{3}",constString1,constString2,constString3,constString4);

string.Format 内部使用 StringBuilder.AppendFormat。现在考虑到我要附加常量字符串,哪个选项(选项 1 或选项 2)在性能和/或内存方面更好?

Assume I have the following string constants:

const string constString1 = "Const String 1";
const string constString2 = "Const String 2";
const string constString3 = "Const String 3";
const string constString4 = "Const String 4";

Now I can append the strings in two ways:
Option1:

string resultString = constString1 + constString2 + constString3 + constString4;

Option2:

string resultString = string.Format("{0}{1}{2}{3}",constString1,constString2,constString3,constString4);

Internally string.Format uses StringBuilder.AppendFormat. Now given the fact that I am appending constant strings, which of the options (option1 or option 2) is better with respect to performance and/or memory?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

只有影子陪我不离不弃 2024-10-27 04:03:02

第一个将由编译器(至少是 Microsoft C# 编译器)完成(与编译器执行 1+2 的方式相同),第二个必须在运行时完成。很明显第一个更快。

作为一个额外的好处,在第一个字符串中字符串被内化,而在第二个字符串中则不是。

而且 String.Format 非常慢:-)(读这个
http://msmvps.com/blogs/jon_skeet/archive /2008/10/06/formatting-strings.aspx)。不是“慢到足以成为问题”,除非你的程序整天做的就是格式化字符串(数百万个,而不是数十个)。然后您可能可以更快地Append将它们添加到StringBuilder

The first one will be done by the compiler (at least the Microsoft C# Compiler) (in the same way that the compiler does 1+2), the second one must be done at runtime. So clearly the first one is faster.

As an added benefit, in the first one the string is internalized, in the second one it isn't.

And String.Format is quite slow :-) (read this
http://msmvps.com/blogs/jon_skeet/archive/2008/10/06/formatting-strings.aspx). NOT "slow enough to be a problem", UNLESS all your program do all the day is format strings (MILLIONS of them, not TENS). Then you could probably to it faster Appending them to a StringBuilder.

时光与爱终年不遇 2024-10-27 04:03:02

第一个变体是最好的,但仅当您使用常量字符串时。

这里有两种有效的编译器优化(来自 C# 编译器,而不是 JIT 编译器)。让我们举一个程序的例子

const string A = "Hello ";
const string B = "World";

...
string test = A + B;

第一个优化是不断的传播,它将把你的代码基本上改变成这样:

string test = "Hello " + "World";

然后,文字字符串的串联(由于第一次优化,就像现在一样)优化将启动并将其更改为

string test = "Hello World";

因此,如果你编写上面显示的程序的任何变体,由于 C# 编译器所做的优化,实际的 IL 将是相同的(或至少非常相似)。

The first variant will be best, but only when you are using constant strings.

There are two compilator optimizations (from the C# compiler, not the JIT compiler) that are in effect here. Lets take one example of a program

const string A = "Hello ";
const string B = "World";

...
string test = A + B;

First optimization is constant propagation that will change your code basically into this:

string test = "Hello " + "World";

Then a concatenation of literal strings (as they are now, due to the first optimization) optimization will kick in and change it to

string test = "Hello World";

So if you write any variants of the program shown above, the actual IL will be the same (or at least very similar) due to the optimizations done by the C# compiler.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文