Note that there are some explanatory texts on larger screens.

plurals
  1. POFaster than String.Replace()
    primarykey
    data
    text
    <p>Is there any other method that is faster than doing like this?</p> <pre><code>private void EscapeStringSequence(ref string data) { data = data.Replace("\\", "\\\\"); // Backslash data = data.Replace("\r", "\\r"); // Carriage return data = data.Replace("\n", "\\n"); // New Line data = data.Replace("\a", "\\a"); // Vertical tab data = data.Replace("\b", "\\b"); // Backspace data = data.Replace("\f", "\\f"); // Formfeed data = data.Replace("\t", "\\t"); // Horizontal tab data = data.Replace("\v", "\\v"); // Vertical tab data = data.Replace("\"", "\\\""); // Double quotation mark data = data.Replace("'", "\\'"); // Single quotation mark } </code></pre> <p>-- Edited (Add explanation) -- <br /> <em>Q1: Is there a reason why you need to speed it up? Is it causing a huge problem?</em> <br /> This part is used in this project: <a href="http://mysqlbackuprestore.codeplex.com/" rel="nofollow">http://mysqlbackuprestore.codeplex.com/</a> <br /> I'm going to loop lots of various length of strings into this function repeatly. The whole process takes around 6-15 seconds to finished for millions of rows. There are other part get involve too. I'm trying to speed up every part.</p> <p><em>Q2: How slow is it now?</em> <br /> OK, I'll capture the exact time used and post it here. I'll come back later. (will post the result tomorrow)</p> <p><strong>Update 29-06-2012</strong><br /> Hey, guys. I have run test. This is the result:<br /> <br/> <strong>Speed Test: String.Replace()</strong> - measured in miliseconds<br/> Test 1: 26749.7531 ms<br /> Test 2: 27063.438 ms<br /> Test 3: 27753.8884 ms<br /> Average: 27189.0265 ms<br /> Speed: 100%<br/> <br /> <strong>Speed Test: Foreach Char and Append</strong> - measured in miliseconds<br /> Test 1: 8468.4547 ms<br /> Test 2: 8348.8527 ms<br /> Test 3: 8353.6476 ms<br /> Average: 8390.3183 ms<br /> <strong>Speed: 224% &lt; faster</strong><br /> ===================================<br /> <strong>Update - Next Test (Another round)</strong><br /> ===================================<br /> ------<br /> Test Replace String Speed.<br /> Test 1: 26535.6466<br /> Test 2: 26379.6464<br /> Test 3: 26379.6463<br /> Average: 26431.6464333333<br /> Speed: 100%<br /> ------<br /> Test Foreach Char String Append.<br /> Test 1: 8502.015<br /> Test 2: 8517.6149<br /> Test 3: 8595.6151<br /> Average: 8538.415<br /> Speed: 309.56%<br /> ------<br /> Test Foreach Char String Append (Fix StringBuilder Length).<br /> Test 1: 8314.8146<br /> Test 2: 8330.4147<br /> Test 3: 8346.0146<br /> Average: 8330.41463333333<br /> Speed: 317.29%<br /> <br /> <br/> Conclusion:<br/> Using Foreach Char Loop and Append is faster than String.Replace().<br /> <br /> Thanks you very much guys.<br /> <br /> --------<br /> Below are the codes that I used to run the test: (edited)<br /></p> <pre><code>using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.Write("Press any key to continue..."); Console.ReadKey(); Console.Write("\r\nProcess started."); Test(); Console.WriteLine("Done."); Console.Read(); } public static Random random = new Random((int)DateTime.Now.Ticks); public static string RandomString(int size) { StringBuilder sb = new StringBuilder(); char ch; for (int i = 0; i &lt; size; i++) { ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))); sb.Append(ch); } return sb.ToString(); } public static void Test() { string text = "\\_\r\n\a\b\f\t\v\"'" + RandomString(2000) + "\\_\r\n\a\b\f\t\v\"'" + RandomString(2000); List&lt;TimeSpan&gt; lstTimeUsed = new List&lt;TimeSpan&gt;(); int target = 100000; for (int i = 0; i &lt; 3; i++) { DateTime startTime = DateTime.Now; for (int j = 0; j &lt; target; j++) { if (j.ToString().EndsWith("000")) { Console.Clear(); Console.WriteLine("Test " + i.ToString()); Console.WriteLine(j.ToString() + " of " + target.ToString()); } string data = text; data = data.Replace("\\", "\\\\"); // Backslash data = data.Replace("\r", "\\r"); // Carriage return data = data.Replace("\n", "\\n"); // New Line data = data.Replace("\a", "\\a"); // Vertical tab data = data.Replace("\b", "\\b"); // Backspace data = data.Replace("\f", "\\f"); // Formfeed data = data.Replace("\t", "\\t"); // Horizontal tab data = data.Replace("\v", "\\v"); // Vertical tab data = data.Replace("\"", "\\\""); // Double quotation mark data = data.Replace("'", "\\'"); // Single quotation mark } DateTime endTime = DateTime.Now; TimeSpan ts = endTime - startTime; lstTimeUsed.Add(ts); } double t1 = lstTimeUsed[0].TotalMilliseconds; double t2 = lstTimeUsed[1].TotalMilliseconds; double t3 = lstTimeUsed[2].TotalMilliseconds; double tOri = (t1 + t2 + t3) / 3; System.IO.TextWriter tw = new System.IO.StreamWriter("D:\\test.txt", true); tw.WriteLine("------"); tw.WriteLine("Test Replace String Speed. Test Time: " + DateTime.Now.ToString()); tw.WriteLine("Test 1: " + t1.ToString()); tw.WriteLine("Test 2: " + t2.ToString()); tw.WriteLine("Test 3: " + t3.ToString()); tw.WriteLine("Average: " + tOri.ToString()); tw.WriteLine("Speed: 100%"); tw.Close(); lstTimeUsed = new List&lt;TimeSpan&gt;(); for (int i = 0; i &lt; 3; i++) { DateTime startTime = DateTime.Now; for (int j = 0; j &lt; target; j++) { if (j.ToString().EndsWith("000")) { Console.Clear(); Console.WriteLine("Test " + i.ToString()); Console.WriteLine(j.ToString() + " of " + target.ToString()); } string data = text; var builder = new StringBuilder(); foreach (var ch in data) { switch (ch) { case '\\': case '\r': case '\n': case '\a': case '\b': case '\f': case '\t': case '\v': case '\"': case '\'': builder.Append('\\'); break; default: break; } builder.Append(ch); } } DateTime endTime = DateTime.Now; TimeSpan ts = endTime - startTime; lstTimeUsed.Add(ts); } t1 = lstTimeUsed[0].TotalMilliseconds; t2 = lstTimeUsed[1].TotalMilliseconds; t3 = lstTimeUsed[2].TotalMilliseconds; tw = new System.IO.StreamWriter("D:\\test.txt", true); tw.WriteLine("------"); tw.WriteLine("Test Foreach Char String Append. Test Time: " + DateTime.Now.ToString()); tw.WriteLine("Test 1: " + t1.ToString()); tw.WriteLine("Test 2: " + t2.ToString()); tw.WriteLine("Test 3: " + t3.ToString()); tw.WriteLine("Average: " + ((t1 + t2 + t3) / 3).ToString()); tw.WriteLine("Speed: " + ((tOri) / ((t1 + t2 + t3) / 3) * 100).ToString("0.00") + "%"); tw.Close(); lstTimeUsed = new List&lt;TimeSpan&gt;(); for (int i = 0; i &lt; 3; i++) { DateTime startTime = DateTime.Now; for (int j = 0; j &lt; target; j++) { if (j.ToString().EndsWith("000")) { Console.Clear(); Console.WriteLine("Test " + i.ToString()); Console.WriteLine(j.ToString() + " of " + target.ToString()); } string data = text; var builder = new StringBuilder(data.Length + 20); foreach (var ch in data) { switch (ch) { case '\\': case '\r': case '\n': case '\a': case '\b': case '\f': case '\t': case '\v': case '\"': case '\'': builder.Append('\\'); break; default: break; } builder.Append(ch); } } DateTime endTime = DateTime.Now; TimeSpan ts = endTime - startTime; lstTimeUsed.Add(ts); } t1 = lstTimeUsed[0].TotalMilliseconds; t2 = lstTimeUsed[1].TotalMilliseconds; t3 = lstTimeUsed[2].TotalMilliseconds; tw = new System.IO.StreamWriter("D:\\test.txt", true); tw.WriteLine("------"); tw.WriteLine("Test Foreach Char String Append (Fix StringBuilder Length). Test Time: " + DateTime.Now.ToString()); tw.WriteLine("Test 1: " + t1.ToString()); tw.WriteLine("Test 2: " + t2.ToString()); tw.WriteLine("Test 3: " + t3.ToString()); tw.WriteLine("Average: " + ((t1 + t2 + t3) / 3).ToString()); tw.WriteLine("Speed: " + ((tOri) / ((t1 + t2 + t3) / 3) * 100).ToString("0.00") + "%"); tw.Close(); } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload