using System.Collections.Generic;
using System.Diagnostics;
private static string[] langs = { "", "pt-BR", "es-ES", "en-UK" };
private static int dic_entries = 50000;
private static int match_iterations = 500000;
private static Dictionary<string, Dictionary<string, string>> translationTags;
private static Stopwatch sw = new Stopwatch();
public static void Main()
Console.WriteLine("Warming up components (so they get cached in memory, etc: the first test will always show poorer results)");
run_batch(tryCatchApproach);
run_batch(defaultApproach);
Console.WriteLine("Warmup complete. Tests are valid from this point onwards.");
run_batch(tryCatchApproach);
run_batch(defaultApproach);
private static void run_batch(Action<string, string> what)
foreach (var lang in new string[] { "en-US", "en-GB" })
private static void fillDic() {
translationTags = new Dictionary<string, Dictionary<string, string>>();
foreach (var lang in langs)
var langdic = new Dictionary<string, string>();
for (var i = 0; i < dic_entries; i++) {
langdic["entry" + i] = "value " + i;
translationTags.Add(lang, langdic);
Console.WriteLine("Filled TranslationTags dictionary with " + translationTags.Count + " entries: ");
foreach (var lang in translationTags.Keys)
Console.WriteLine("- " + lang + ": " + translationTags[lang].Count);
private static void test(Action<string, string> what, bool match, string culture)
var val_pfx = match ? "value" : "nothn";
for (int i = 0; i < match_iterations; i++)
what.Invoke(val_pfx + (i % dic_entries), culture);
Console.WriteLine(what.Method.Name + ", all " + (match ? "matching" : "missing") +
" " + match_iterations + " queries, run in :" + sw.ElapsedMilliseconds + "ms.");
private static void tryCatchApproach(string value, string culture = "")
Dictionary<string, string> tagsRepo;
var entry = default(KeyValuePair<string, string>);
if (translationTags.TryGetValue(culture, out tagsRepo))
entry = tagsRepo.First(e => e.Value == value);
catch (InvalidOperationException)
entry = translationTags[string.Empty].First(e => e.Value == value);
catch (InvalidOperationException) { };
private static void defaultApproach(string value, string culture = "")
Dictionary<string, string> tagsRepo;
var entry = default(KeyValuePair<string, string>);
if (translationTags.TryGetValue(culture, out tagsRepo))
if (tagsRepo.ContainsKey(value)) {
entry = tagsRepo.First(e => e.Value == value);
entry = translationTags[string.Empty].FirstOrDefault(e => e.Value == value);