registerNamespace('Symfony\Component\Finder', dirname(__DIR__) . '\symfony\src'); function no_op($text) { return $text; } function format_kb($size, $previous_size = NULL) { $out = ''; if (isset($previous_size)) { $size = $size - $previous_size; $out = ($size > 0 ? '+' : ''); } $out .= number_format($size / 1024, 2) . ' KB'; return $out; } /** * Initialization. */ if (file_exists(DRUPAL_ROOT . '/.git/HEAD')) { readfile(DRUPAL_ROOT . '/.git/HEAD'); } const ITERATIONS = 10; $data = 'text is the argument'; // Default initialization. $memory_peak_init = memory_get_peak_usage(); echo 'Peak memory before test: ' . format_kb($memory_peak_init) . PHP_EOL; echo 'Iterations: ' . ITERATIONS . PHP_EOL; echo PHP_EOL; $start = microtime(true); for ($i=0; $i < ITERATIONS; ++$i) { } $stop = microtime(true); echo 'nothing: ' . round($stop - $start, 4) . ' seconds' . PHP_EOL; $start = microtime(true); for ($i=0; $i < ITERATIONS; ++$i) { $text = no_op($data); } $stop = microtime(true); echo 'function no_op(): ' . round($stop - $start, 4) . ' seconds' . PHP_EOL; /** * Test cases. */ $dir = 'core/modules'; $mask = '/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.module$/'; $start = microtime(true); for ($i=0; $i < ITERATIONS; ++$i) { $files_to_add = file_scan_directory($dir, $mask, array( 'key' => 'name', 'min_depth' => 1, // Do not recurse into ./lib directories; they cannot contain extensions. // We also skip templates, css, and js directories. // @todo Find a way to skip ./config directories (but not modules/config). 'nomask' => '/^(CVS|lib|templates|css|js)$/', )); } $stop = microtime(true); echo 'drupal_system_listing()' . ': ' . round($stop - $start, 4) . ' seconds' . PHP_EOL; $skip_dirs = array('config', 'lib', 'templates', 'js', 'css'); $skip_dirs = array_combine($skip_dirs, $skip_dirs); $start = microtime(true); for ($i=0; $i < ITERATIONS; ++$i) { $flags = FilesystemIterator::UNIX_PATHS | FilesystemIterator::SKIP_DOTS; $flags |= FilesystemIterator::CURRENT_AS_SELF; $flags |= FilesystemIterator::KEY_AS_FILENAME; $directory = new RecursiveDirectoryIterator($dir, $flags); $filter = new SystemListRecursiveFilterIterator($directory, $mask, $skip_dirs); $iterator = new RecursiveIteratorIterator($filter); $files = array(); foreach ($iterator as $filename => $file) { $file->uri = $file->getPathName(); $file->filename = $file->getFileName(); $file->name = pathinfo($file->filename, PATHINFO_FILENAME); $files[$file->name] = $file; } } $stop = microtime(true); echo 'SystemListRecursiveFilterIterator' . ': ' . round($stop - $start, 4) . ' seconds' . PHP_EOL; /* $start = microtime(true); for ($i=0; $i < ITERATIONS; ++$i) { $extension = 'module'; $finder = new Symfony\Component\Finder\Finder(); $finder ->files() ->depth('> 1') ->name($mask) ->exclude(array('lib', 'templates', 'js', 'css', 'config')) ->in('core/modules'); $files = array(); foreach ($finder as $file) { $file->uri = $file->getPathName(); $file->filename = $file->getFileName(); $file->name = pathinfo($file->filename, PATHINFO_FILENAME); $files[$file->name] = $file; } } $stop = microtime(true); echo 'Finder' . ': ' . round($stop - $start, 4) . ' seconds' . PHP_EOL; */ # This is what Finder is doing under the hood: /* $mask = '/\/' . DRUPAL_PHP_FUNCTION_PATTERN . '\.module$/'; $start = microtime(true); for ($i=0; $i < ITERATIONS; ++$i) { $flags = FilesystemIterator::UNIX_PATHS | FilesystemIterator::SKIP_DOTS; $flags |= FilesystemIterator::CURRENT_AS_FILEINFO; $flags |= FilesystemIterator::KEY_AS_FILENAME; $results = new RecursiveDirectoryIterator($dir, $flags); $flattened = new RecursiveIteratorIterator($results); $filtered = new RegexIterator($flattened, $mask); $files = array(); foreach ($filtered as $filename => $file) { $file->uri = $file->getPathName(); $file->filename = $file->getFileName(); $file->name = pathinfo($file->filename, PATHINFO_FILENAME); $files[$file->name] = $file; } } $stop = microtime(true); echo 'DirectoryIterator' . ': ' . round($stop - $start, 4) . ' seconds' . PHP_EOL; */ /** * Tear down. */ echo PHP_EOL; $memory_peak_end = memory_get_peak_usage(); echo 'Peak memory after test: ' . format_kb($memory_peak_end) . PHP_EOL; echo 'Memory difference: ' . format_kb($memory_peak_end, $memory_peak_init) . PHP_EOL; class SystemListRecursiveFilterIterator extends RecursiveFilterIterator { protected $regex; protected $hasExtension; protected $skipExtensionDirs; public function __construct(RecursiveIterator $iterator, $regex, array $skip_dirs, $has_extension = FALSE) { $this->hasExtension = $has_extension; $this->regex = $regex; $this->skipExtensionDirs = $skip_dirs; parent::__construct($iterator); } public function getChildren() { return new self($this->getInnerIterator()->getChildren(), $this->regex, $this->skipExtensionDirs, $this->hasExtension); } public function accept() { if ($this->isDir()) { if (!$this->hasExtension) { return TRUE; } // If the directory name does not appear in the names to skip, accept it. return !isset($this->skipExtensionDirs[$this->current()->getFilename()]); } else { $is_extension = preg_match($this->regex, $this->current()->getFilename()); if ($is_extension) { $this->hasExtension = TRUE; } return $is_extension; } } }