繁体   English   中英

减少执行时间

[英]Reduce the execution time

我有一个excel文件和一个config xml文件。这个config 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的rowcount * excelfile的rowcount比较。 当得到两个文件á1 000行时,您将执行1 000 * 1 000 = 1 000 000比较操作。

取而代之的是繁琐的工作,而是取一个文件并将节点值读入哈希表。 然后循环遍历另一个文件,并检查是否从哈希表中找到该值。

这可能不是最终的解决方案,但是它非常简单有效,只需将较大的循环作为外部循环,将较小的循环作为内部循环,然后在找到密钥时中断:

foreach(key in excelfile)
{
    foreach(node in xmlfile)
    {
        if(key.Equals(node))
        {
            print node +"found"
            break;
        }
    }
}

这将消除每次xml迭代时整个大excel文件的开销循环(使用break时,否则没有区别),相反,它将为每个excel迭代循环小xml文件,甚至在匹配时中断。

一种选择是从其中一个集合构建备用正则表达式,然后将其与-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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM