gpt4 book ai didi

php - 通过深度优先或广度优先发现文件夹树

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:09:51 24 4
gpt4 key购买 nike

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

    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;
}

谢谢!

最佳答案

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

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

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

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

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

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

关于php - 通过深度优先或广度优先发现文件夹树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12937313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com