Skip to content

Instantly share code, notes, and snippets.

@waf
Created February 5, 2016 02:38
Show Gist options
  • Save waf/d95bebd0e48a0f79594c to your computer and use it in GitHub Desktop.
Save waf/d95bebd0e48a0f79594c to your computer and use it in GitHub Desktop.
C# string replacement performance
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace TestRun
{
// sample test run results
// NaiveRawString took 18
// NaiveStringBuilder took 33
// RegexReplace took 24
// RegexReplaceOneShot took 159
// RegexReplaceCaseInsensitive took 35
// RegexReplaceOneShotCaseInsensitive took 204
class Program
{
static void Main(string[] args)
{
var tests = new Func<string, IDictionary<string, string>, string>[]
{
NaiveRawString,
NaiveStringBuilder,
RegexReplace,
RegexReplaceOneShot,
RegexReplaceCaseInsensitive,
RegexReplaceOneShotCaseInsensitive
};
var inputTexts = Enumerable.Repeat(texts, 1000).SelectMany(t => t).ToArray();
var replacements = new Dictionary<string, string>
{
{"sit","replaced-1"},
{"in","replaced-2"},
{"et","replaced-3"},
};
Console.WriteLine("press any key to start");
Console.ReadKey(intercept: true);
foreach (var test in tests)
{
var sw = Stopwatch.StartNew();
foreach (var text in inputTexts)
{
var result = test(text, replacements);
if(result == null)
{
throw new Exception("replacement failed");
}
}
sw.Stop();
Console.WriteLine(test.Method.Name + " took " + sw.ElapsedMilliseconds);
}
Console.ReadKey();
}
static string NaiveRawString(string text, IDictionary<string, string> replacements)
{
string result = text;
foreach (var replacement in replacements)
{
result = result.Replace("{{" + replacement.Key + "}}", replacement.Value);
}
return result;
}
static string NaiveStringBuilder(string text, IDictionary<string, string> replacements)
{
var result = new StringBuilder(text);
foreach (var replacement in replacements)
{
result.Replace("{{" + replacement.Key + "}}", replacement.Value);
}
return result.ToString();
}
static string RegexReplace(string text, IDictionary<string, string> replacements)
{
var result = text;
foreach (var replacement in replacements)
{
result = Regex.Replace(result, "{{" + replacement.Key + "}}", replacement.Value);
}
return result;
}
static string RegexReplaceCaseInsensitive(string text, IDictionary<string, string> replacements)
{
var result = text;
foreach (var replacement in replacements)
{
result = Regex.Replace(result, "{{" + replacement.Key + "}}", replacement.Value, RegexOptions.IgnoreCase);
}
return result;
}
static string RegexReplaceOneShot(string text, IDictionary<string, string> replacements)
{
return Regex.Replace(text,
"(" + string.Join("|", replacements.Keys.ToArray()) + ")",
match => replacements[match.Value]);
}
static string RegexReplaceOneShotCaseInsensitive(string text, IDictionary<string, string> replacements)
{
return Regex.Replace(text,
"(" + string.Join("|", replacements.Keys.ToArray()) + ")",
match => replacements[match.Value.ToLower()],
RegexOptions.IgnoreCase);
}
static string[] texts =
{
"Lorem ipsum dolor {{sit}} amet, consectetur adipiscing elit. Quisque at massa ante. Integer sollicitudin tortor {{et}} risus tincidunt, nec porta ex mattis. Aenean sodales lacus ac nulla ultrices, {{et}} mattis ipsum suscipit. Sed ultricies congue elit auctor tempor. Curabitur ut mi aliquet, eleifend lorem eu, bibendum purus. Donec porttitor ac diam sed tincidunt. Praesent porttitor pulvinar arcu, nec tempor tellus laoreet nec.",
"Praesent eleifend euismod scelerisque. Pellentesque {{in}} metus quis ligula sollicitudin scelerisque. Proin volutpat felis dui, {{sit}} amet faucibus magna lobortis {{sit}} amet. Sed a pretium enim. Phasellus aliquet nec ex {{sit}} amet dignissim. Aenean ipsum libero, ultricies nec elit quis, tempus condimentum tellus. Aenean lacus mi, porta vel tincidunt a, eleifend rhoncus mi. Vestibulum {{in}} orci odio. Nulla nec ullamcorper urna. Curabitur porta, elit non interdum tincidunt, dolor turpis venenatis arcu, ac vulputate neque tellus {{et}} purus",
"Pellentesque habitant morbi tristique senectus {{et}} netus {{et}} malesuada fames ac turpis egestas. Ut vel efficitur velit, quis mollis magna. Proin vel arcu nibh. Aenean vitae tellus ex. Sed {{et}} felis cursus, placerat tellus quis, facilisis lacus. Maecenas eros dolor, venenatis a tellus eu, pulvinar laoreet tellus. Curabitur fermentum nisl ut tellus pharetra, a dictum augue mollis. Nam porttitor vulputate lacinia.",
"Sed odio nisi, iaculis a luctus egestas, eleifend {{et}} orci. Maecenas interdum lorem nec nisi finibus sollicitudin {{sit}} amet at massa. Sed eu massa rutrum, suscipit nunc ut, accumsan felis. Nunc maximus, justo at malesuada imperdiet, odio nisl pulvinar turpis, a vestibulum odio",
"Donec consectetur vulputate urna porttitor mollis. Nunc aliquam tempus tellus {{in}} congue. Praesent accumsan eleifend nulla {{in}} rutrum. Integer egestas nisl {{in}} nibh ultrices ornare. Proin pulvinar felis dolor, at suscipit mauris volutpat vestibulum. Proin tincidunt, sapien convallis",
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment