c# - 检查 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 开始。我正在考虑让它变小。
解决方案
我会做 3 件事:
- 在构造函数中修剪你的
bi_issuer
字段bank_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;
}
}
现在,我不知道所有这些的代码,或者它运行的环境等,但你也可以潜在地使用并行性(但不要盲目使用它,因为如果代码不是'可能会出现问题' t 自包含,如果您使用非线程安全的非自包含代码)。
想象上面的代码在一个方法bool TryPopulateIssuer(card tmpcard)
中,并且来自一个卡片列表:List<card> cards
,你可以这样写代码:
Parallel.ForEach(cards, card => {
if (!TryPopulateIssuer(card))
{
// do something on failure to find the issuer
}
});
推荐阅读
- dependencies - Gradle 不会下载 fabric-sdk-java 的依赖项
- oracle - 在事务回滚的情况下处理全局临时表中的数据
- sql-server - 如何通过比较 2 个表来根据日期时间获取数据库中的最新记录
- dart - Dart2 路由器实现
- teamcity - 如何在 Teamcity 2019.1 的实验 UI 中按最新编号对构建列表进行排序
- javascript - 如何将其转换为基于类的 Javascript?
- asp.net - 哪种服务最适合在请求之间存储数据和计算某事(注入控制器)?
- regex - 带有下划线和删除额外字母的骆驼案例到蛇案例错误?
- c# - 将 Int[] 数组向下转换为 Byte[] 数组
- angular - 如何将不是使用 Angular CLI 创建的 Angular 应用程序迁移到 Angular CLI 项目?