1

我必须在文件夹中找到“最深”文件夹的路径。为此,我实现了两种算法,一种比另一种快得多。有谁知道为什么?我想这与硬盘硬件有一些联系,但我想了解。这是快速的:

    private function getHostAux($path) {
        $matches = array();
        $folder = rtrim($path, DIRECTORY_SEPARATOR);

        $moreFolders = glob($folder.DIRECTORY_SEPARATOR.'*', GLOB_ONLYDIR);
        if (count($moreFolders) == 0) {
           $matches[] = $folder;
        } else {
            foreach ($moreFolders as $fd) {
                $arr = $this->getHostAux($fd);
                $matches = array_merge($matches, $arr);
            }
        }
        return $matches;
    }

这是慢速的:

    /**
     * Breadth-first function using glob
     */
private function getHostAux($path) {
    $matches = array();
    $folders = array(rtrim($path, DIRECTORY_SEPARATOR));
    $i = 0;
    while($folder = array_shift($folders)) {
        $moreFolders = glob($folder.DIRECTORY_SEPARATOR.'*', GLOB_ONLYDIR);
        if (count($moreFolders == 0)) {
            $matches[$i] = $folder;
        }
        $folders = array_merge($folders, $moreFolders);
        $i++;
    }
    return $matches;
}

谢谢 !

4

2 回答 2

1

您没有提供可能对理解您观察到的这些“时间”至关重要的其他信息。(我故意写了引号,因为你没有具体说明“慢”和“快”的含义以及你是如何测量它的。)

假设提供的信息是真实的,并且第一种方法的加速比大于百分之几,并且您已经在各种大小和深度的目录上对其进行了测试......

首先,我想评论提供的答案:

  • 我不会那么肯定你的答案。首先,我认为您的意思是“内核句柄”。但这不是真的,因为glob没有打开句柄。你是怎么想出这个答案的?
  • 两个版本的总迭代次数相同。

并添加我自己的一些东西:

  • 我怀疑array_shift()可能会导致速度变慢,因为每次调用它时它都会重新索引整个数组。
  • 您 glob 的顺序可能很重要,具体取决于底层操作系统和文件系统。
  • 您的代码中有一个错误(可能)。您$i在每个 glob 之后递增,而不是在向$matches数组添加元素之后递增。这会导致$matches数组稀疏,这可能会导致合并、移位甚至添加过程变慢。我不确切知道 PHP 是否是这种情况,但我知道几种语言中的数组具有这些属性,这些属性有时在编码时很难记住。我建议修复此问题,再次计时代码并查看是否有任何不同。
于 2013-01-26T15:54:52.093 回答
0

我认为您的第一个递归算法的迭代次数比第二个算法少。尝试观察每个算法使用辅助变量进行了多少次迭代。

于 2012-10-17T15:46:44.127 回答