我有一个性能问题。
我正在解析大型文本文件(账单)并根据账单上是否出现某些文本将服务提供商的名称分配给一个变量。
这是我正在做的一个小样本(不要笑,我知道这很混乱)。总而言之,大约有 250 个 if 和 else if。
if (txtvar.BillText.IndexOf("SWGAS.COM") > -1)
{
txtvar.Provider = "Southwest Gas";
}
else if (txtvar.BillText.IndexOf("georgiapower.com") > -1)
{
txtvar.Provider = "Georgia Power";
}
else if (txtvar.BillText.IndexOf("City of Austin") > -1)
{
txtvar.Provider = "City of Austin";
}
// 以此类推 250 次
因为它变得如此之大,我决定采取不同的方法来更清洁、更高效。我最终实现了一个映射,我将它存储在一个外部 .psv 文件中。
我将该映射保存到一个变量中(这只运行一次,大约需要 35 毫秒......
var providerMap =
System.IO.File.ReadLines(@"U:\Program\ApplicationFiles\ProvidersList.psv")
.Select(line => line.Split('|'))
.Select(parts => new Provider() { Pattern = parts[0], Name = parts[1] }).ToList();
...然后遍历每个账单(分配提供者大约需要 2 毫秒,而 if 语句花费的时间不到一半......
foreach (string bills in files)
{
string Provider = providerMap.First(p => txtvar.BillText.IndexOf(p.Pattern) > -1).Name;
OtherStuff();
}
虽然这个解决方案更干净,但它比 250+ if, else if 慢得多。我使用秒表方法发现,更清洁的方法实际上比数百个 if 语句慢一倍。(我测试了 if 语句的开头和结尾的账单以及类似结果的映射)
有人可以向我解释一下吗?也许我做错了什么?谢谢!