glob() для создания массива файлов или массива жесткого кода? Скорость важна, но автоматизация — это хорошо

Извините за неинформативное название, не был уверен, как это назвать :-)

Я написал API, который загружает необходимые библиотеки javascript из каталога на моем сервере. Каталоги имеют определенный формат, единственное, что может отличаться, это формат имени файла в каталоге каждой библиотеки.

Формат каталога

_js/_источник/_имя_библиотеки_здесь/имя_файла_здесь.js

e.g.

/_js/_source/_fancybox/jQuery.lightbox-0.5.js

Массив (в настоящее время жестко запрограммирован)

На данный момент у меня есть отдельные библиотеки, хранящиеся в массиве (жестко запрограммированные), например:

$js_libraries = array(
    'fancybox'       => '/_js/_source/_fancybox/jQuery.lightbox-0.5.js',
    'something_else' => '/_js/_source/_something_else/jQuery.something.js'
);

Потенциальная альтернатива

Этот API был бы намного более динамичным, если бы массив $js_libraries создавался автоматически путем сканирования каталога '_source' и заполнения массива подобным образом. Я бы сделал это с помощью что-то вроде (не проверено, просто пример!):

function gather_files($directory){
    $files_and_folders = scandir($directory);
    foreach($files_and_folders as $value){
        if($value != '.' && $value != '..'){
            if(is_dir($directory.'/'.$value)){
                listFolderFiles($dir.'/'.$ff);
            }
        }
    }
}

$js_libraries = gather_files(dirname(__FILE__));

Вышеупомянутое не завершено, просто хотел продемонстрировать, что я имею в виду под автоматическим построением массива на основе содержимого каталога

Мой вопрос

Проще говоря, ключом этого API является скорость, поскольку он возвращает упакованные/минимизированные (с помощью PHP на лету) файлы javascript на HTML-страницу и, следовательно, не может иметь никаких задержек, поскольку это задержит запуск страницы. Я хотел бы знать, будет ли автоматический метод заметно медленнее, если в этом каталоге много библиотек? Должен ли я просто придерживаться жестко заданного массива?


person Ben Carey    schedule 24.10.2012    source источник
comment
вы смотрели на функцию glob()?   -  person    schedule 25.10.2012
comment
Да, конечно, то, как я собираю файлы, не очень важно, на самом деле код, который я написал, ужасен. Скорее всего, я бы использовал функцию glob(). Я просто хочу знать, будет ли это заметно медленнее :-)   -  person Ben Carey    schedule 25.10.2012
comment
есть только способ определить скорость, измерить ее.   -  person    schedule 25.10.2012
comment
почему бы вам просто не проверить и посмотреть?   -  person user428517    schedule 25.10.2012
comment
Преждевременная оптимизация — корень всех зол. Если вам нужно повысить производительность позже, выгрузите массив, который вы получили от glob(), в файл и прочитайте его оттуда.   -  person KingCrunch    schedule 25.10.2012
comment
Да, я согласен, но чувствовал, что приду сюда, чтобы спросить других об их опыте, поскольку в будущем папка может содержать более 100 библиотек, поэтому бенчмаркинг не обязательно справедлив.   -  person Ben Carey    schedule 25.10.2012
comment
@БенКэри Почему? Нетрудно создать 100 или 1000 файлов.   -  person KingCrunch    schedule 25.10.2012
comment
поэтому добавьте 100 файлов в папку, а затем оцените ее. затем попробуйте 1000. затем 10000. scandir() не является рекурсивным, поэтому ваши тесты должны прекрасно представлять реальный случай.   -  person user428517    schedule 25.10.2012
comment
@KingCrunch очень верно :-) Мне всегда нравится слышать мнения других людей, поскольку они могут указывать на другие слабости или потенциальные недостатки :-)   -  person Ben Carey    schedule 25.10.2012
comment
какая тут может быть неисправность? если вы хотите узнать, работает ли он медленнее, протестируйте его! если вам нужно, чтобы он обрабатывал 10 000 файлов, протестируйте его с 10 000 файлов. если он достаточно быстрый, он всегда будет достаточно быстрым, потому что scandir() не является рекурсивным.   -  person user428517    schedule 25.10.2012
comment
возможно, вы хотели просмотреть код, а не переполнить стек?   -  person    schedule 25.10.2012
comment
@Dagon никогда не слышал о проверке кода, звучит примерно так :-). Честно говоря, я просто хотел узнать ваше мнение. По-прежнему будет принимать ответы, если они будут опубликованы, но постарается перейти на проверку кода.   -  person Ben Carey    schedule 25.10.2012
comment
@sgroves В этом случае я согласен, что здесь очень мало или совсем нет места для недостатков, но нет ничего плохого в том, чтобы спросить второе мнение, особенно когда ваш код используется сотнями веб-сайтов в день. Просто чтобы убедиться, что я делаю все максимально эффективно :-)   -  person Ben Carey    schedule 25.10.2012
comment
@Dagon: Code Review не принял бы это. Поверьте мне, я провожу там много времени. Код должен работать, а это явно не так. Однако, если ОП заработает, мы с радостью примем это.   -  person mseancole    schedule 25.10.2012
comment
@mseancole Я, вероятно, отправлю на рассмотрение весь API, так как это только одна его часть, но, вероятно, последняя часть, если я не найду никаких ошибок :-)   -  person Ben Carey    schedule 25.10.2012
comment
Удачи, надеюсь увидеть вас там :)   -  person mseancole    schedule 25.10.2012


Ответы (1)


Всегда ориентироваться

Что касается реальной скорости, перечисление глубоких иерархий файловой системы, вероятно, больше связано с вводом-выводом, чем что-либо еще, но, пожалуйста, не верьте мне или не верьте своей интуиции, всегда ориентир.

Что касается оптимизации: скорость — не единственный вариант, вы можете выбрать низкое использование памяти и используйте класс GlobIterator или объединить другие RecursiveDirectoryIterator, настраиваемый подкласс FilterIterator и RecursiveIteratorIterator, чтобы получить объект, который можно использовать в foreach и возвращает нужные файлы по одному за раз.

person complex857    schedule 24.10.2012