readdir vs scandir

Thi*_*key 33 php

1]哪个功能更快?
2]有什么区别?

Differences

1] readdir返回目录中下一个条目的名称.Scandir从目录中返回一组文件和目录.

2] readdir必须打开资源句柄,直到读取所有条目.scandir,也许会创建一个包含所有条目的数组并关闭资源句柄?

Rob*_*ahy 16

这实际上取决于您对数据的处理方式.

如果您正在逐个输入,那么您应该使用readdir,如果您确实需要在内存中有一个条目列表,那么您应该使用它scandir.

无论如何,当你打算逐个使用它时,将信息复制到内存中是没有意义的.懒惰的评估绝对是这种情况下的方法.

我想这scandir只是一个围绕着readdir调用的东西的包装器,因此会更慢.


Auf*_*gel 15

只是得到结果(没有做任何事情),readdir是最小的:

<?php

$count = 10000;

$dir = '/home/brati';

$startScan = microtime(true);
for ($i=0;$i<$count;$i++) {
    $array = scandir($dir);
}
$endScan = microtime(true);


$startRead = microtime(true);
for ($i=0;$i<$count;$i++) {
    $handle = opendir($dir);
    while (false !== ($entry = readdir($handle))) {
        // We do not know what to do
    }
}
$endRead = microtime(true);

echo "scandir: " . ($endScan-$startScan) . "\n";
echo "readdir: " . ($endRead-$startRead) . "\n";
Run Code Online (Sandbox Code Playgroud)

得到:

== RUN 1 ==
scandir: 5.3707950115204
readdir: 5.006147146225

== RUN 2 ==
scandir: 5.4619920253754
readdir: 4.9940950870514

== RUN 3 ==
scandir: 5.5265231132507
readdir: 5.1714680194855
Run Code Online (Sandbox Code Playgroud)

当然,这取决于你打算做什么.如果你必须使用scandir()编写另一个循环,它会更慢.


Vit*_*aly 5

我知道这个问题可能现在并不实际,但是要补充一点,我已经做了一些测试(例如Aufziehvogel和Sayahan),它们之间的差别很小-在具有1,000,000个小文件(几个字节)的目录上。

$dir = dirname(__FILE__) . '/dir';

$startScan = microtime(true);
$array = scandir($dir);
for ($i = 0, $j = count($array); $i < $j; $i++) {
    // Code
}
$endScan = microtime(true);
unset($array);

$startRead = microtime(true);
$handle = opendir($dir);
while (false !== ($entry = readdir($handle))) {
    // Code
}
$endRead = microtime(true);
unset($handle);
unset($entry);

$startDir = microtime(true);
$files = new DirectoryIterator($dir);
foreach ($files as $file) {
    // Code
}
$endDir = microtime(true);
unset($files);

echo 'scandir:           ', ($endScan - $startScan), PHP_EOL;
echo 'readdir:           ', ($endRead - $startRead), PHP_EOL;
echo 'DirectoryIterator: ', ($endDir - $startDir), PHP_EOL;
Run Code Online (Sandbox Code Playgroud)

结果(HDD):

scandir:           1.9403479099274
readdir:           0.79462885856628
DirectoryIterator: 0.5853099822998
Run Code Online (Sandbox Code Playgroud)

结果(SSD):

scandir:           0.83593201637268
readdir:           0.35835003852844
DirectoryIterator: 0.28022909164429
Run Code Online (Sandbox Code Playgroud)

CPU:AMD A10-4600M APU with Radeon(tm)HD Graphics(4 cores)
MEM:8G
PHP:5.6.29