c# - if, else if 与映射性能

标签 c# performance if-statement mapping

我有一个性能问题。

我正在解析大型文本文件(账单)并根据账单上是否出现特定文本将服务提供商的名称分配给变量。

这是我正在做的事情的一小部分(别笑,我知道这很乱)。总而言之,大约有 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/

相关文章:

hadoop mapreduce编程if条件

c# - 无法加载文件或程序集“AjaxControlToolkit,

c# - 在一定数量的字符后格式化字符串

c# - 声明空字节 - 可空对象必须有一个值?

performance - HHVM 性能不佳

android - 异常调度输入事件,同时调用 startActivity

c# - 'CustomerId' 操作的结果中不存在所需的列 'FromSql'

performance - 通用多面体内的长方体

Java - 可选循环

JQuery 如果 css 上的条件不起作用