减少执行时间

本文关键字:执行时间 | 更新日期: 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 文件,甚至在匹配时中断。