美好的一天
我需要让我的代码运行得更快。我需要一次检查 700 万条记录,执行以下检查需要 1 到 3 毫秒。我希望 somone 能给我关于如何更快地做到这一点的建议。
在下面的代码之前,我做了一个选择来预加载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 开始,作为每个系统设计。我正在考虑让它变小。
我会做3件事:
在bank_issuer
的构造函数中修剪您的bi_issuer
字段 - 每次都这样做是没有意义的。我不知道你是否需要这样做,但如果它不需要修剪,那就根本不做。- 从您的银行发行人列表中创建一个字典以利用密钥哈希 (
var bankIssuers = bank_issuer_list.ToDictionary(bi => bi.bi_issuer);
( - 在开始该过程之前,在任何循环之外执行此操作,并使用此字典进行查找。 - 更改使用字典的方法:
-
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
}
});