Проверка номеров БИН из <list>+ повышение производительности - PullRequest
0 голосов
/ 05 сентября 2018

Добрый день

Мне нужно, чтобы мой код работал быстрее. Мне нужно проверять 7 миллионов записей одновременно, и для следующей проверки требуется от 1 до 3 мс. Я надеялся, что Сомоне даст мне совет, как сделать это быстрее.

Перед приведенным ниже кодом я делаю выбор, чтобы предварительно загрузить класс bank_issuer (это бывает) и загрузить tmpCard для файла (.txt).

 //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 в соответствии с дизайном системы. Я пытаюсь уменьшить его.

1 Ответ

0 голосов
/ 05 сентября 2018

Я бы сделал 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;   
    }
}

Теперь, я не знаю ни о коде вокруг всего этого, ни о среде, в которой он запущен, и т. Д., Но вы также можете потенциально использовать параллелизм (но не используйте его вслепую, поскольку могут возникнуть проблемы, если код не является самодостаточным, если вы используете несамостоятельный код, который не является потокобезопасным).

Представьте код выше в методе bool TryPopulateIssuer(card tmpcard), и он получен из списка карточек: List<card> cards, вы можете написать код так:

Parallel.ForEach(cards, card => {
    if (!TryPopulateIssuer(card))
    {
        // do something on failure to find the issuer
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...