4

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?

8
  • 7
    this smacks of premature optimization. Commented Mar 2, 2011 at 7:11
  • Possible duplicate stackoverflow.com/questions/296978/… Commented Mar 2, 2011 at 7:12
  • 1
    @nathan - and of trying to optimize without measuring... Commented Mar 2, 2011 at 7:17
  • @System.Exception No, different question. Here he's asking of concat of const strings. The "side" effect (how the compiler optimizes it) is interesting enough that a new question is ok. The result (concat is faster than format) is the same, but for another reason. Commented Mar 2, 2011 at 7:17
  • 1
    @xanatos: There's no technical reason why concat should be faster than format in this case (all strings are constant, including the format string). Commented Mar 2, 2011 at 7:21

2 Answers 2

11

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.

Sign up to request clarification or add additional context in comments.

7 Comments

Even a C++ compiler could optimize both of these to the same instructions, the CLR JIT should have no trouble coalescing them to the same assemblies. Of course, it might not actually do it, but not for lack of information. The only way to know for sure is to test it.
Actually, the optimizations you are referring to here are optimizations done by the C# compiler, and not by the JIT-compiler.
Sure, my point was that even if the CLR compiler didn't do it (which it clearly could, since you have enough information at compile time), it certainly could easily do it at runtime.
@Øyvind Yeah. I have checked it with Reflector and I'm correcting.
I am not so sure about the string interning here. I ran a test indicating that the string is interned also by the string.Format scenario (which I found somewhat surprising).
|
0

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.

1 Comment

No, the first version will be best either way; with non-literals it will still compile to a single string.Concat call, and doesn't need to parse a format string ("{0}{1}{2}{3}")

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.