首页 > 解决方案 > 检查 BIN 编号+ 性能增强

问题描述

再会

我需要让我的代码运行得更快。我需要一次检查 700 万条记录,执行以下检查需要 1 到 3 毫秒。我希望有人给我建议,告诉我如何更快地做到这一点。

在下面的代码之前,我选择预加载 bank_issuer 类(发生这种情况)并为文件(.txt)加载 tmpCard。

 //golbal in class
 private List<bank_issuer> bank_issuer_list { get; set; }

          //code that I need help with

           for (int i = 10; i >= 1; i--)
            {
             string card_nr = tmpCard.card_number.Substring(0, i);

             foreach (bank_issuer item in bank_issuer_list)
              {
                if (card_nr.ToString() == item.bi_issuer.ToString().Trim())
                 {
                   issuer_found = true;
                   tmpcard.bp_id = item.bp_id;
                   break;
                 }
              }
              if (val_issuer_found)
               {
                  break;
               }                 
            }

class bank_issuer
{
    public string bi_issuer { get; set; }
    public string bp_id { get; set; }

    public bank_issuer(string bi_issuer, string bp_id)
    {
        this.bi_issuer = bi_issuer;
        this.bp_id = bp_id;
    }
    public bank_issuer()
    {
    }
}

注意:根据系统设计,第一个 for 循环从 10 开始。我正在考虑让它变小。

标签: c#performancelogic

解决方案


我会做 3 件事:

  1. 在构造函数中修剪你的bi_issuer字段bank_issuer- 每次都这样做是没有意义的。我不知道你是否需要这样做,但如果它不需要修剪,就不要这样做。
  2. 从您的银行发行人列表中创建一个字典以利用密钥散列 ( var bankIssuers = bank_issuer_list.ToDictionary(bi => bi.bi_issuer);) - 在开始该过程之前,在任何循环之外执行此操作,并使用此字典进行查找。
  3. 更改您的方法以使用字典:

-

for (int i = 10; i >= 1; i--)
{
    string card_nr = tmpCard.card_number.Substring(0, i);
    if (bankIssuers.TryGetValue(card_nr, out var issuer))
    {
        issuer_found = true;
        tmpcard.bp_id = issuer.bp_id;
        break;   
    }
}

现在,我不知道所有这些的代码,或者它运行的环境等,但你也可以潜在地使用并行性(但不要盲目使用它,因为如果代码不是'可能会出现问题' t 自包含,如果您使用非线程安全的非自包含代码)。

想象上面的代码在一个方法bool TryPopulateIssuer(card tmpcard)中,并且来自一个卡片列表:List<card> cards,你可以这样写代码:

Parallel.ForEach(cards, card => {
    if (!TryPopulateIssuer(card))
    {
        // do something on failure to find the issuer
    }
});

推荐阅读