Я просматриваю весь раздел, stat()
просматриваю каждый файл, а затем проверяю возвращаемые значения mtime, size и uid на хешированные значения. stat()
однако слишком медленный в Perl, и мне интересно, есть ли более быстрые альтернативы, которые я могу упустить.
Есть ли более быстрая альтернатива статистике Perl?
Ответы (6)
Когда вы вызываете stat
, вы запрашиваете файловую систему и будете ограничены ее производительностью. Для большого количества файлов это будет медленным; это не совсем проблема Perl.
Прежде чем приступить к оптимизации stat, используйте Devel :: NYTProf, чтобы увидеть реальное замедление.
Также изучите детали того, как вы смонтировали файловую систему. Все ли локально, или вы что-то смонтировали через NFS или что-то подобное? Как указывали другие ответы, существует много вещей, которые могут быть проблемой. Не тратьте слишком много времени на потенциальную проблему, пока не поймете, что это проблема.
Удачи,
stat
выполняет ввод-вывод для каждого файла, чего нельзя избежать, если вы хотите прочитать эти данные. Так что это будет предел скорости, и его нельзя обойти никаким другим способом, который я могу придумать.
Если вы неоднократно stat
загружаете одни и те же файлы, подумайте об использовании Memoize
.
use Memoize();
sub fileStat {
my ($filename) = @_;
return stat($filename);
}
Memoize::memoize('fileStat');
Вы видели, что stat
и так достаточно медленный, поэтому не Не вызывайте его более одного раза в одном и том же файле.
В документации perlfunc по -X (операторы проверки файлов shell-ish) описывается приятный кеш для stat
:
Если любому из файловых тестов (или операторам
stat
илиlstat
) присваивается специальный дескриптор файла, состоящий из одиночного подчеркивания, то используется структура stat из предыдущего теста файла (или оператора stat), сохраняя системный вызов. (Это не работает с-t
, и вам нужно помнить, чтоlstat
и-l
оставят значения в структуре статистики для символьной ссылки, а не для реального файла.) (Кроме того, если буфер статистики был заполнен вызовомlstat
,-T
и-B
сбросят его с результатамиstat _
). Пример:print "Can do.\n" if -r $a || -w _ || -x _; stat($filename); print "Readable\n" if -r _; print "Writable\n" if -w _; print "Executable\n" if -x _; print "Setuid\n" if -u _; print "Setgid\n" if -g _; print "Sticky\n" if -k _; print "Text\n" if -T _; print "Binary\n" if -B _;
- Если вы используете * NIX, вы можете просто использовать
ls
и анализировать вывод, я думаю. - Как упоминалось в эфире,
find
, возможно, является хорошей альтернативой, если вы просто хотите принимать решения о том, что вы показываете. - Но размер, дата и uid должны быть доступны из
ls
вывода. - Дата и размер доступны с помощью команды
dir
на платформе Windows.
ls
и find
также будут использовать stat
системный вызов через метод библиотеки C. Если эти подходы улучшают производительность, то это не из-за stat
как такового.
- person Stephen C; 08.01.2010
stat
более эффективно. Я не знаю.
- person Axeman; 08.01.2010