减少执行时间
本文关键字:执行时间 | 更新日期: 2023-09-27 17:56:13
我有一个excel文件和一个config xml文件。此配置 xml 文件包含 excel 文件中存在的一些键。我的目标是解析 xml 文件并找出 excel 文件中是否存在密钥。我使用了 2 个循环来执行此操作。完成需要花费大量时间。我的代码语法如下。
foreach(node in xmlfile)
{
foreach(key in excelfile)
{
if(key.Equals(node))
{
print node +"found"
}
}
}
上述代码的问题是搜索 excel 文件需要花费大量时间。我的 excel 文件太大了,除了 xml 文件中的键之外,还有很多键。
还有其他更好的方法来完成这项任务吗?
该解决方案尽可能低效。那是因为
foreach(node in xmlfile)
{
foreach(key in excelfile)
{
if(key.Equals(node))
{
将执行 xmlfile 的行计数 * excelfile 的行计数比较。当你得到时,比如说两个文件1000行,你将执行1000 * 1 000 = 1 000 000个比较操作。
与其进行如此繁重的工作,不如将其中一个文件并将节点值读取到哈希表中。然后遍历另一个文件一次,并检查是否从哈希表中找到该值。
一种选择是从其中一个集合构建一个交替正则表达式,然后将其与 -match 运算符一起使用以对抗另一个集合:
$collection = 1..10
$even = 2,4,6,8,10
[regex]$even_regex = ‘(?i)^(‘ + (($even |foreach {[regex]::escape($_)}) –join “|”) + ‘)$’
$collection -match $even_regex |
foreach { "Found $_ "}
Found 2
Found 4
Found 6
Found 8
Found 10
这可能不是你的最终解决方案,但它非常简单有效,只需将较大的循环作为外循环,将小循环作为内部循环,然后在找到密钥后中断:
foreach(key in excelfile)
{
foreach(node in xmlfile)
{
if(key.Equals(node))
{
print node +"found"
break;
}
}
}
这将消除每次 XML 迭代时对整个大 Excel 文件的开销循环(使用 break 时,否则没有差异),相反,它将循环访问每个 Excel 迭代的小 XML 文件,甚至在匹配时中断。