【发布时间】:2013-09-24 15:03:29
【问题描述】:
我有一个性能问题。
我正在解析大型文本文件(账单)并根据账单上是否出现某些文本将服务提供商的名称分配给一个变量。
这是我正在做的一个小例子(别笑,我知道这很乱)。总而言之,大约有 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 语句开头和结尾的账单,并得到了类似的结果)
谁能给我解释一下?也许我做错了什么?谢谢!
【问题讨论】:
-
慢两倍是多少? 4秒而不是2秒?多少是不可接受的?
-
另外,哪一部分比较慢?您的清洁方法不止做一件事 - 每张账单的循环速度较慢,还是只是从文件中读取映射会减慢速度? (我假设您没有为每张账单阅读您的提供商地图,对吧?)
-
你有很多变量,包括两个完全独立的任务。解决方案的哪个部分较慢?
Read还是Loop?此外,这里可能没有考虑到的东西——可维护性、250+If、Else,甚至Switch,如果你要不断地构建它,可能会成为一场噩梦。这些是我的想法;但如果没有更多信息,我帮不了你。 -
映射的初始读取只发生一次,大约需要 35 毫秒。在 Foreach 中分配提供者是较慢的部分。它大约需要 2 毫秒,而旧的 if else 方法大约需要 0.75 毫秒。我知道差异很小,不会对我的程序产生太大影响。我只是想知道是否有人知道为什么需要两倍的时间。
-
循环展开是一种常见的优化技术。你做了相反的事情,所以我并不惊讶它变慢了。
标签: c# performance if-statement mapping