Bug #78094 [Opn->Ver]: File Search Problem Excessive Time
| From: | cmb@php.net | Date: | Sun, 02 Jun 2019 11:51:38 +0000 |
| Subject: | Bug #78094 [Opn->Ver]: File Search Problem Excessive Time | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-221081@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=78094&edit=1
ID: 78094
Updated by: cmb@php.net
Reported by: dpfender44 at gmail dot com
Summary: File Search Problem Excessive Time
-Status: Open
+Status: Verified
Type: Bug
Package: *Directory/Filesystem functions
Operating System: Windows 10
-PHP Version: Next Major Version
+PHP Version: 7.4Git-2019-06-02 (snap)
Block user comment: N
Private report: N
New Comment:
Thanks for reporting this issue. I can confirm a severe
performance regression with the following script:
<?php
$start = hrtime(true);
$count = scandirrec('D:/git/php/php-src/ext');
$end = hrtime(true);
printf("%d files found in %f sec\n", $count, ($end-$start)/1e9);
function scandirrec($dir)
{
$count = 0;
$owd = getcwd();
chdir($dir);
$files = scandir('.');
foreach ($files as $file) {
if ($file[0] === '.') continue;
if (is_dir($file)) {
$count += scandirrec("$dir/$file");
} else {
$count++;
}
}
chdir($owd);
return $count;
}
?>
Running with php-7.3.6-nts-Win32-VC15-x64, I get something like:
14105 files found in 0.245927 sec
but with php-7.4-nts-windows-vs16-x64-r7a64150 and
php-7.4-nts-windows-vc15-x64-re2f8d90 (latest VC 15 snap),
something like:
14105 files found in 1.028066 sec
(all three PHP versions running without php.ini)
Previous Comments:
------------------------------------------------------------------------
[2019-06-01 15:00:20] dpfender44 at gmail dot com
All of the filesystem functions take longer than in PHP 7.3.6 and is_dir() is the worst.
Elapsed time for a recursive file search over several directories is in units of seconds.
Time values are derived from using microtime() before and after each system function is used.
Total count of files returned is 777;
PHP 7.3.6
getcwd total 0.00004625
is_dir total 0.02332211
opendir total 0.00398731
readdir total 0.00258327
chdir total 0.00327039
closedir total 0.00072503
Total Elapsed 0.03843498
PHP 7.4.0-dev
getcwd total 0 00007987
is_dir total 3.32146049
opendir total 0.00476623
readdir total 0.00765395
chdir total 0.00488377
closedir total 0.00070310
Total Elapsed 3.35602283
------------------------------------------------------------------------
[2019-06-01 11:14:58] ab@php.net
Thanks for the report. Could you please reduce the repro snippet to the absolutely required lines,
only Windows related, only issue related?
Thanks.
------------------------------------------------------------------------
[2019-05-31 17:09:43] dpfender44 at gmail dot com
Description:
------------
My function scan_dir() uses opendir(), chdir(), readdir(), is_dir(), closedir() to scan for files on
the server.
PHP version 7.4.0-dev does the same scan as version 7.3.6 but takes about 100 times longer.
This is all done on the same server, but just switching between PHP versions on 5/31/19.
The extra time seems to be spent doing readdir().
Test script:
---------------
http://djpsrc.djpnet.dyndns.org/test_scan_dir.php.txt
Expected result:
----------------
PHP version 7.3.6
Operating System Microsoft Windows [Version 10.0.17763.503]
File search types: .mp4|.webm|.mp3|.wav|.mid|.txt
Units of seconds (Unix timestamp from microtime()):
Start file search time (1559247589.134)
End file search time (1559247589.1699)
Elapsed time (0.035879135131836)
Resulting file match count (777)
Actual result:
--------------
PHP version 7.4.0-dev
Operating System Microsoft Windows [Version 10.0.17763.503]
File search types: .mp4|.webm|.mp3|.wav|.mid|.txt
Units of seconds (Unix timestamp from microtime()):
Start file search time (1559320102.0205)
End file search time (1559320105.3702)
Elapsed time (3.3497362136841)
Resulting file match count (777)
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=78094&edit=1