Title: C# String array + File.WriteAllLines vs StringBuilder + File.WriteAllText
Slug: c-string-array-file-writealllines-vs-stringbuilder-file-writealltext
Date: 2011-03-14 00:11:00
Author: Kartones
Lang: en
Tags: Development, C#
Description: A comparison between using C# String array + File.WriteAllLines and StringBuilder + File.WriteAllText for writing large amounts of data to a file.

 <p>I usually store for later reading blog posts. I was reading this post from my friend Vicente about Code Katas when I noticed that he used <font face="Courier New">File.WriteAllLines</font> to save a <font face="Courier New">string[]</font> and I thought "won't be faster to use <font face="Courier New">StringBuilder</font> + <font face="Courier New">File.WriteAllText</font>?". So I built a small test to check which one is faster.</p> <p>Both code fragments create the first 20,000,000 integer numbers starting from zero, adding <font face="Courier New">\n\r</font> in the case of the <font face="Courier New">StringBuilder</font> to simulate different lines. The number is chosen by hand after having fun getting out of memory exceptions trying with Int32.MaxValue, and with 20M numbers I already achieved more than 1 second write operations in my SSD hard disk (both tests create a nice 180MB txt file).</p> <p><b>string[] + WriteAllLines</b></p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:029220f1-be50-497e-aa26-ff1d3cdcddbd" class="wlWriterEditableSmartContent"> <div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"> <div style="background: #fff; overflow: auto"> <ol style="background: #000000; margin: 0; padding: 0 0 0 5px;"> <li><span style="color:#00bfff">const</span><span style="color:#e0e0e0"> </span><span style="color:#00bfff">int</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">SIZE</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#ffff00">20000000</span><span style="color:#e0e0e0">;</span></li> <li style="background: #0c0c0c"> </li> <li>        <span style="color:#e0e0e0"></span><span style="color:#00bfff">static</span><span style="color:#e0e0e0"> </span><span style="color:#00bfff">void</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">Main</span><span style="color:#e0e0e0">(</span><span style="color:#00bfff">string</span><span style="color:#e0e0e0">[] </span><span style="color:#adc6d3">args</span><span style="color:#e0e0e0">)</span></li> <li style="background: #0c0c0c">        <span style="color:#e0e0e0">{</span></li> <li>            <span style="color:#e0e0e0"></span><span style="color:#00ff80">Stopwatch</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">stopWatchProgram</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#00bfff">new</span><span style="color:#e0e0e0"> </span><span style="color:#00ff80">Stopwatch</span><span style="color:#e0e0e0">();</span></li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#00ff80">Stopwatch</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">stopWatchWrite</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#00bfff">new</span><span style="color:#e0e0e0"> </span><span style="color:#00ff80">Stopwatch</span><span style="color:#e0e0e0">();</span></li> <li> </li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#adc6d3">stopWatchProgram</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Start</span><span style="color:#e0e0e0">();</span></li> <li> </li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#00bfff">string</span><span style="color:#e0e0e0">[] </span><span style="color:#adc6d3">lines</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#00bfff">new</span><span style="color:#e0e0e0"> </span><span style="color:#00bfff">string</span><span style="color:#e0e0e0">[</span><span style="color:#adc6d3">SIZE</span><span style="color:#e0e0e0">];</span></li> <li> </li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#00bfff">int</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">i</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#ffff00">0</span><span style="color:#e0e0e0">;</span></li> <li>            <span style="color:#e0e0e0"></span><span style="color:#00bfff">for</span><span style="color:#e0e0e0"> (</span><span style="color:#adc6d3">i</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#ffff00">0</span><span style="color:#e0e0e0">; </span><span style="color:#adc6d3">i</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">&lt;</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">SIZE</span><span style="color:#e0e0e0">; </span><span style="color:#adc6d3">i</span><span style="color:#c0c0c0">++</span><span style="color:#e0e0e0">)</span></li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0">{</span></li> <li>                <span style="color:#e0e0e0"></span><span style="color:#adc6d3">lines</span><span style="color:#e0e0e0">[</span><span style="color:#adc6d3">i</span><span style="color:#e0e0e0">] </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">i</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">ToString</span><span style="color:#e0e0e0">();</span></li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0">}</span></li> <li> </li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#adc6d3">stopWatchWrite</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Start</span><span style="color:#e0e0e0">();</span></li> <li> </li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#00ff80">File</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">WriteAllLines</span><span style="color:#e0e0e0">(</span><span style="color:#ff9f71">@"c:\testwritealllines.txt"</span><span style="color:#e0e0e0">, </span><span style="color:#adc6d3">lines</span><span style="color:#e0e0e0">);</span></li> <li> </li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#adc6d3">stopWatchWrite</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Stop</span><span style="color:#e0e0e0">();</span></li> <li>            <span style="color:#e0e0e0"></span><span style="color:#adc6d3">stopWatchProgram</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Stop</span><span style="color:#e0e0e0">();</span></li> <li style="background: #0c0c0c"> </li> <li>            <span style="color:#e0e0e0"></span><span style="color:#00d2d2">TimeSpan</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">ts</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">stopWatchProgram</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Elapsed</span><span style="color:#e0e0e0">;</span></li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#00bfff">string</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">elapsedTime</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#00ff80">String</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Format</span><span style="color:#e0e0e0">(</span><span style="color:#aed7ff">"Program: {0}:{1:00}"</span><span style="color:#e0e0e0">, </span><span style="color:#adc6d3">ts</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Seconds</span><span style="color:#e0e0e0">, </span><span style="color:#adc6d3">ts</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Milliseconds</span><span style="color:#e0e0e0">);</span></li> <li>            <span style="color:#e0e0e0"></span><span style="color:#00ff80">Console</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">WriteLine</span><span style="color:#e0e0e0">(</span><span style="color:#adc6d3">elapsedTime</span><span style="color:#e0e0e0">);</span></li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#adc6d3">ts</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">stopWatchWrite</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Elapsed</span><span style="color:#e0e0e0">;</span></li> <li>            <span style="color:#e0e0e0"></span><span style="color:#adc6d3">elapsedTime</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#00ff80">String</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Format</span><span style="color:#e0e0e0">(</span><span style="color:#aed7ff">"Write file: {0}:{1:00}"</span><span style="color:#e0e0e0">, </span><span style="color:#adc6d3">ts</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Seconds</span><span style="color:#e0e0e0">, </span><span style="color:#adc6d3">ts</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Milliseconds</span><span style="color:#e0e0e0">);</span></li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#00ff80">Console</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">WriteLine</span><span style="color:#e0e0e0">(</span><span style="color:#adc6d3">elapsedTime</span><span style="color:#e0e0e0">);</span></li> <li>            <span style="color:#e0e0e0"></span><span style="color:#00ff80">Console</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">ReadLine</span><span style="color:#e0e0e0">();</span></li> <li style="background: #0c0c0c">        <span style="color:#e0e0e0">}</span></li> </ol> </div> </div> </div> <p><b>StringBuilder + WriteAllText</b></p> <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:f2800bf7-13f7-4f4a-b56c-00d9903fd491" class="wlWriterEditableSmartContent"> <div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"> <div style="background: #fff; overflow: auto"> <ol style="background: #000000; margin: 0; padding: 0 0 0 5px;"> <li><span style="color:#00bfff">const</span><span style="color:#e0e0e0"> </span><span style="color:#00bfff">int</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">SIZE</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#ffff00">20000000</span><span style="color:#e0e0e0">;</span></li> <li style="background: #0c0c0c"> </li> <li>        <span style="color:#e0e0e0"></span><span style="color:#00bfff">static</span><span style="color:#e0e0e0"> </span><span style="color:#00bfff">void</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">Main</span><span style="color:#e0e0e0">(</span><span style="color:#00bfff">string</span><span style="color:#e0e0e0">[] </span><span style="color:#adc6d3">args</span><span style="color:#e0e0e0">)</span></li> <li style="background: #0c0c0c">        <span style="color:#e0e0e0">{</span></li> <li>            <span style="color:#e0e0e0"></span><span style="color:#00ff80">Stopwatch</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">stopWatchProgram</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#00bfff">new</span><span style="color:#e0e0e0"> </span><span style="color:#00ff80">Stopwatch</span><span style="color:#e0e0e0">();</span></li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#00ff80">Stopwatch</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">stopWatchWrite</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#00bfff">new</span><span style="color:#e0e0e0"> </span><span style="color:#00ff80">Stopwatch</span><span style="color:#e0e0e0">();</span></li> <li> </li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#adc6d3">stopWatchProgram</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Start</span><span style="color:#e0e0e0">();</span></li> <li> </li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#00ff80">StringBuilder</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">lines</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#00bfff">new</span><span style="color:#e0e0e0"> </span><span style="color:#00ff80">StringBuilder</span><span style="color:#e0e0e0">(</span><span style="color:#adc6d3">SIZE</span><span style="color:#e0e0e0">);</span></li> <li> </li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#00bfff">int</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">i</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#ffff00">0</span><span style="color:#e0e0e0">;</span></li> <li>            <span style="color:#e0e0e0"></span><span style="color:#00bfff">for</span><span style="color:#e0e0e0"> (</span><span style="color:#adc6d3">i</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#ffff00">0</span><span style="color:#e0e0e0">; </span><span style="color:#adc6d3">i</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">&lt;</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">SIZE</span><span style="color:#e0e0e0">; </span><span style="color:#adc6d3">i</span><span style="color:#c0c0c0">++</span><span style="color:#e0e0e0">)</span></li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0">{</span></li> <li>                <span style="color:#e0e0e0"></span><span style="color:#adc6d3">lines</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Append</span><span style="color:#e0e0e0">(</span><span style="color:#adc6d3">i</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">ToString</span><span style="color:#e0e0e0">());</span></li> <li style="background: #0c0c0c">                <span style="color:#e0e0e0"></span><span style="color:#adc6d3">lines</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Append</span><span style="color:#e0e0e0">(</span><span style="color:#aed7ff">"\n\r"</span><span style="color:#e0e0e0">);</span></li> <li>            <span style="color:#e0e0e0">}</span></li> <li style="background: #0c0c0c"> </li> <li>            <span style="color:#e0e0e0"></span><span style="color:#adc6d3">stopWatchWrite</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Start</span><span style="color:#e0e0e0">();</span></li> <li style="background: #0c0c0c"> </li> <li>            <span style="color:#e0e0e0"></span><span style="color:#00ff80">File</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">WriteAllText</span><span style="color:#e0e0e0">(</span><span style="color:#ff9f71">@"c:\testwritealltext.txt"</span><span style="color:#e0e0e0">, </span><span style="color:#adc6d3">lines</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">ToString</span><span style="color:#e0e0e0">());</span></li> <li style="background: #0c0c0c"> </li> <li>            <span style="color:#e0e0e0"></span><span style="color:#adc6d3">stopWatchWrite</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Stop</span><span style="color:#e0e0e0">();</span></li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#adc6d3">stopWatchProgram</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Stop</span><span style="color:#e0e0e0">();</span></li> <li> </li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#00d2d2">TimeSpan</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">ts</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">stopWatchProgram</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Elapsed</span><span style="color:#e0e0e0">;</span></li> <li>            <span style="color:#e0e0e0"></span><span style="color:#00bfff">string</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">elapsedTime</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#00ff80">String</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Format</span><span style="color:#e0e0e0">(</span><span style="color:#aed7ff">"Program: {0}:{1:00}"</span><span style="color:#e0e0e0">, </span><span style="color:#adc6d3">ts</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Seconds</span><span style="color:#e0e0e0">, </span><span style="color:#adc6d3">ts</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Milliseconds</span><span style="color:#e0e0e0">);</span></li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#00ff80">Console</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">WriteLine</span><span style="color:#e0e0e0">(</span><span style="color:#adc6d3">elapsedTime</span><span style="color:#e0e0e0">);</span></li> <li>            <span style="color:#e0e0e0"></span><span style="color:#adc6d3">ts</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#adc6d3">stopWatchWrite</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Elapsed</span><span style="color:#e0e0e0">;</span></li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#adc6d3">elapsedTime</span><span style="color:#e0e0e0"> </span><span style="color:#c0c0c0">=</span><span style="color:#e0e0e0"> </span><span style="color:#00ff80">String</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Format</span><span style="color:#e0e0e0">(</span><span style="color:#aed7ff">"Write file: {0}:{1:00}"</span><span style="color:#e0e0e0">, </span><span style="color:#adc6d3">ts</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Seconds</span><span style="color:#e0e0e0">, </span><span style="color:#adc6d3">ts</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">Milliseconds</span><span style="color:#e0e0e0">);</span></li> <li>            <span style="color:#e0e0e0"></span><span style="color:#00ff80">Console</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">WriteLine</span><span style="color:#e0e0e0">(</span><span style="color:#adc6d3">elapsedTime</span><span style="color:#e0e0e0">);</span></li> <li style="background: #0c0c0c">            <span style="color:#e0e0e0"></span><span style="color:#00ff80">Console</span><span style="color:#c0c0c0">.</span><span style="color:#adc6d3">ReadLine</span><span style="color:#e0e0e0">();</span></li> <li>        <span style="color:#e0e0e0">}</span></li> </ol> </div> </div> </div> <p> </p> <p>And the results are:</p> <p>string[] + WriteAllLines:<br><font face="Courier New">Program: 9.468<br>Write file: 2.607</font>  </p><p>StringBuilder + WriteAllText:<br><font face="Courier New">Program: 5.791<br>Write file: 1.138</font> </p><p> </p> <p>Using Stringbuilder seems to be faster overall: 3.6 less seconds calculating the "lines" and less than half time writing the file.</p> <p>While taking the units into account it doesn't matter which one to use (1 second or 2 is not much for us human beings) it is interesting that even with a non-properly sized Stringbuilder it performs faster (a proper starting capacity means no need to redimensionate it internally to increase the capacity when gets full).</p> <p>I didn't do any advanced tests like writing in buffers with the size of my HDD cluster blocks, maybe doing a buffered Stringbuilder contents read and FileStream write in blocks of for example 4KB would be faster, but would add a complexity that is too much for a simple text write into a file.</p> <p> </p> <p>Anyway, as usual StringBuilder proves to be a worthy candiate for string operations, and this posts proves that I should sleep more and code less stupid tests :)</p>
