我有一个性能问题。
我正在解析大型文本文件(账单)并根据账单上是否出现特定文本将服务提供商的名称分配给变量。
这是我正在做的事情的一小部分(别笑,我知道这很乱)。总而言之,大约有 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 语句和映射的开始和结束的账单,结果相似)
有人能给我解释一下吗?也许我做错了什么?谢谢!
最佳答案
读取外部文件肯定会减慢您的速度。我假设您只读过一次,但它仍然会减慢您的速度。
1) 您是否尝试缓存文件的内容以便您不需要再次读取它?如果映射变化不大,这可能是一种改进。
2) 另外,为什么不尝试将映射存储在 Dictionary 对象(或类似结构)中?如果你愿意,你可以把它放在一个单独的类文件中。这是一个硬编码的解决方案,不确定它在您的系统中的表现如何。
关于c# - if, else if 与映射性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18985242/