首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >readdir对scandir

readdir对scandir
EN

Stack Overflow用户
提问于 2012-01-01 10:54:36
回答 5查看 29K关注 0票数 35

1)哪一种功能更快?

2)两者有什么不同?

Differences

readdir返回目录中下一个条目的名称。从目录中返回一个文件和目录数组。2] readdir必须打开一个资源句柄,直到读取所有条目为止。,可能会创建所有条目的数组,并关闭资源句柄?。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-01 11:40:28

只要得到结果(什么都不做),readdir的速度是最小的:

代码语言:javascript
复制
<?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";

给予:

代码语言:javascript
复制
== RUN 1 ==
scandir: 5.3707950115204
readdir: 5.006147146225

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

== RUN 3 ==
scandir: 5.5265231132507
readdir: 5.1714680194855

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

票数 18
EN

Stack Overflow用户

发布于 2012-01-01 11:00:49

这真的取决于你对数据做了什么。

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

当您要逐项使用时,将信息复制到内存中是没有意义的。在这种情况下,懒惰的评估肯定是可行的。

我可以想象,scandir只是readdir调用的同一个东西的包装器,因此速度会更慢。

票数 16
EN

Stack Overflow用户

发布于 2017-01-07 13:18:12

我知道这个问题现在可能不是实际问题,但是为了附加一些测试(比如Aufziehvogel和Sayahan),我做了一些小区别--在一个包含1,000,000个小文件(几个字节)的目录上。

代码语言:javascript
复制
$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;

成果(人类发展):

代码语言:javascript
复制
scandir:           1.9403479099274
readdir:           0.79462885856628
DirectoryIterator: 0.5853099822998

结果(SSD):

代码语言:javascript
复制
scandir:           0.83593201637268
readdir:           0.35835003852844
DirectoryIterator: 0.28022909164429

CPU: AMDA10-4600mAPU,带有Radeon(tm) HD图形(4核)

MEM: 8G

PHP: 5.6.29

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8692764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档