我必须找到文件夹中“最深”文件夹的路径。为此,我实现了两种算法,一种比另一种快。 有谁知道为什么?我想这与硬盘硬件有一些联系,但我想了解。 这是快速的:
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;
}
谢谢!
答案 0 :(得分:1)
您尚未提供可能对理解您观察到的这些“时间”至关重要的其他信息。 (我故意写了引号,因为你没有指明“慢”和“快”是什么意思,你究竟是怎么测量的。)
假设提供的信息为真,并且第一种方法的加速比大于百分之几,并且您已经在各种大小和深度的目录上进行了测试......
首先,我想对所提供的答案发表评论:
glob
没有打开句柄。你是怎么想出这个答案的?并添加一些自己的东西:
array_shift()
可能导致速度减慢,因为每次调用它时都会重新索引整个数组。$i
,而不是在向$matches
数组添加元素之后递增$matches
。这导致{{1}}数组稀疏,这可能导致合并,移位甚至添加过程变慢。我不知道究竟是否是PHP的情况,但我知道几种语言,其中数组具有这些属性,有时在编码时很难记住。我建议修复此问题,再次对代码进行计时,看看是否有任何区别。答案 1 :(得分:0)
我认为你的第一个递归算法比第二个算法的迭代次数少。尝试观察每个算法使用辅助变量进行的迭代次数。