.Net: String vs. StringBuilder

When handling strings in .NET, it's known that it's "usually more efficient" to use StringBuilder.Append than String + String. However, using StringBuilder sacrifices a (small) amount of code readability, and creating a new StringBuilder() requires a certain amount of processor time in itself. So when is that trade off in efficiency worth it, and when is it best to stick with using a simple String + String?

.Net String vs. StringBuilder - concatenation performance discusses this in a fair amount of detail. The article is a couple of years old now (August 2004), but it's well written and contains code snippets as well as graphs to back up the findings.

The summary points of the findings:

  • If you have no idea on the resulting string size, use StringBuilder if you have at least 7 concatenations.
  • If you can roughly (with 30% accuracy) estimate the resulting string size, use StringBuilder if you have at least 5 concatenations.
  • If you can estimate the resulting string size with good accuracy, use StringBuilder if you have at least 3 concatenations.
  • Under no conditions is StringBuilder faster for less than 3 concatenations.
  • StringBuilder beats strings for 10+ concatenations in every practical situation.
  • The longer the strings are, the more final string size estimations will help you (but accuracy becomes more critical).
  • Further, he concludes:

    StringBuilder performance is a tricky thing. In the last chapter you saw that the StringBuilder with perfect size estimation can be 15 times faster than normal string concatenation. But earlier in the article you also saw that even the default StringBuilder beats normal string catenation by a clear marginal once the cutoff point of 4-8 concatenations is passed. Except for the most critical string handling loops, optimizing the process to the point of making perfect estimations isn't usually worth it. For reasons of code clarity you might even want to avoid using StringBuilder when the amount of concatenations is only slightly over the cutoff point and you're working with an operation that's not critical to the millisecond level. For example, constructing a ten-part SQL statement is likely to be faster with StringBuilder, but the speed difference is negligible when compared to the execution time of that statement. Though, once you become familiar with the StringBuilder class, you'll be reading sb.Appends just like you read plus signs.

    Useful reading for anyone looking to do some performance tuning on a string heavy app.

     Print | Posted on Friday, November 24, 2006 2:53 PM |



    Feedback

    No comments posted yet.


    Post Comment

    Title  
    Name  
    Email
    Website / Url
     

    Your comment

       
    Ensure the word in this box says 'orange':
     
    Please add 8 and 3 and type the answer here:





    Due to excessive comment spam, all comments are now being moderated. If you're a comment spammer then you're wasting your time here. Your comments will not be published - ever.


    About me

    My name is Ross Hawkins and I'm a developer, consultant, business owner and writer based in Auckland, New Zealand (pictured below!). My current work revolves around ASP.NET, C#, jQuery, Ajax, SQL Server, and a mix of other Microsoft development technologies.

    I also have about 15 years of experience with IBM Lotus Notes/Domino and associated technologies. While Notes/Domino is no longer my primary focus I still like to dabble and keep my skills up to date.

    I own and run 2 businesses - Hawkins Consulting Services, and Ignition Development.

    Bethells Beach, located in sunny West Auckland, New Zealand




    Subscribe

    Subscribe to this feed


    Search




    Popular Content

    Troubleshooting WebResource.axd

    The .NET 2.0 framework changed the way clientside JavaScript is delivered to the browser. Previously, ASP.NET 1.1 used the aspnet_client directory whereas now 2.0 uses WebResource.axd.

    Published on October 8, 2006

    jQuery Wildcard Selectors - some simple examples

    I wrote about jQuery wildcard selector syntax briefly back in 2009, and since then that post has received a lot of views – way more than a post that brief should ever have seen..

    Published on October 14, 2011

    Microsoft AJAX Extensions: Sys.Debug is null or not an object

    One of the breaking changes which was made with the 1.0 release of the Microsoft Ajax Extensions was the renaming of the 'Debug' class to 'Sys.Debug' for reasons of compatiability with other frameworks. Breaking changes like this can often be a source of frustration..

    Published on May 22, 2007

    Simple ASP.NET Character Counter

    A textbox character counter is a pretty simple piece of functionality, and there's a lot of different ways to apply one to your application. The following method is nice and simple, and can be done using only clientside JavaScript if required, or combined with server side code in order to create a more dynamic effect

    Published on December 4, 2006

    Simple ASP.NET Character Counter - with Master Page Support

    A quick update to my previous character counter article adding some changes for those using it with Master Pages.

    Published on February 7th, 2009

    Adding Tooltips to Gridview Headers

    As the title says, this is a very simple but dynamic way of achieving tooltip text on a header column. It's not overly flash, but it's lightweight and quick to implement.

    Published on April 15, 2007

    SQL Server Web Report Viewer Issues on Windows 2008 Server/IIS7

    A fix for another AXD related issue, this time with the SQL Server Web Report Viewer Control which was being served up via IIS7 on a Windows 2008 server.

    Published on June 2, 2007
    Updated on April 10, 2008





    Archives

    May, 2012 (1)
    April, 2012 (4)
    March, 2012 (2)
    February, 2012 (4)
    January, 2012 (3)
    December, 2011 (3)
    November, 2011 (8)
    October, 2011 (9)
    September, 2011 (8)
    August, 2011 (5)
    July, 2011 (4)
    June, 2011 (7)
    May, 2011 (5)
    April, 2011 (3)
    March, 2011 (8)
    February, 2011 (4)
    January, 2011 (3)
    December, 2010 (8)
    November, 2010 (5)
    October, 2010 (6)
    September, 2010 (7)
    August, 2010 (11)
    July, 2010 (12)
    June, 2010 (8)
    May, 2010 (8)
    April, 2010 (4)
    March, 2010 (8)
    February, 2010 (6)
    January, 2010 (12)
    December, 2009 (13)
    November, 2009 (11)
    October, 2009 (12)
    September, 2009 (12)
    August, 2009 (2)
    July, 2009 (7)
    June, 2009 (12)
    May, 2009 (9)
    April, 2009 (9)
    March, 2009 (9)
    February, 2009 (8)
    January, 2009 (7)
    December, 2008 (6)
    November, 2008 (7)
    October, 2008 (9)
    September, 2008 (12)
    August, 2008 (9)
    July, 2008 (6)
    June, 2008 (24)
    May, 2008 (13)
    April, 2008 (16)
    March, 2008 (8)
    February, 2008 (10)
    January, 2008 (1)
    December, 2007 (14)
    November, 2007 (11)
    October, 2007 (11)
    September, 2007 (13)
    August, 2007 (11)
    July, 2007 (5)
    June, 2007 (15)
    May, 2007 (11)
    April, 2007 (9)
    March, 2007 (9)
    February, 2007 (10)
    January, 2007 (8)
    December, 2006 (18)
    November, 2006 (11)
    October, 2006 (14)
    September, 2006 (9)
    August, 2006 (10)
    July, 2006 (4)
    June, 2006 (4)
    May, 2006 (6)
    April, 2006 (3)
    February, 2006 (6)
    January, 2006 (10)
    September, 2005 (2)
    August, 2005 (4)

    Post Categories

    ASP.NET
    AJAX
    Amusing
    NZ
    NZ Trains
    Notes/Domino
    Visual Studio
    Web Development
    Miscellaneous
    Me
    Rugby
    C#
    SQL