字符串驻留性能的问题

3
我很好奇。这种情况下是一个具有100个并发连接和每秒多达20个页面加载的Web应用/网站。
如果该应用程序需要提供格式化的字符串。
string.Format("Hello, {0}", username);

"Hello, {0}"会被编入池中吗?还是只有在使用相同字面值的字符串时才会编入池中。

string hello = "Hello, {0}";
string.Format(hello, username);

关于实习,哪种方式可以提供更好的性能:上述方法还是下面这个方法?
StringBuilder builder = new StringBuilder()
builder.Append("Hello, ");
builder.Append(username);

甚至可以
string hello = "Hello, {0}";
StringBuilder builder = new StringBuilder()
builder.Append("Hello, ");
builder.Append(username);

我的主要问题是: 1)string.Format文字串是否会被内部化 2)为了快速查找,是否值得为stringbuilder设置变量名,或者 3)如果上面的#1不行,查找本身就很重

我意识到这可能只会带来微小的收益,但正如我所说,我很好奇。


请将您的标题修改为一个真正的问题。 - Kena
完成了,我能要回我的投票吗? :-) - Dave Archer
4个回答

6

3

String.Format实际上在内部使用StringBuilder,因此没有理由直接在代码中调用它。就文本池化而言,两个代码版本与C#编译器将创建一个临时变量来存储文本池化的字面值相同。

最后,在网页中进行的文本池化效果微乎其微。页面呈现实质上是一个重度字符串操作过程,所以文本池化所带来的差异微不足道。您可以通过使用页面和控件缓存来更轻松地实现更大的性能提升。


2
虽然 String.Format 使用字符串构建器来连接字符串,但仍然需要解析格式字符串以获取其参数。 - Sven Hecht
1
另一种选择是逐步构建字符串,这样创建的代码更难编写、阅读和维护。性能提升太小,不能证明其合理性。还有其他更有用的方法来提高性能,例如输出缓存。 - Panagiotis Kanavos

0
快速答案:运行10万次迭代并找出答案。

0

你无法击败它

return "Hello, " + username;

如果您的情况确实那么简单。

这不是真的。StringBuilder和String.Concat()都要快得多。 - Sven Hecht
3
“Hello, " + username;” 会编译成 string.Concat("Hello, ", username),所以我认为你是不正确的。 - Brian Booth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接