Не отрицаю, но сделал его во избежании комментариев с утверждением того, что тот или иной метод в разы быстрее. Я лишь подтвердил, что способы равнозначны.
В третьем и четвертом примерах опечатки (аргумент $filename, а в теле функции используются $fileName).
Ради интереса протестировал все функции с именами файлов, которые
а) не содержат расширения (file)
б) имя файла с путем, в котором есть расширение (/path.dir/file.ext)
в) имя файла без расширения с путем, в котором есть расширение (/path.dir/file)
Результаты:
а)
1 'file'
PHP Notice: Undefined index: extension in /tmp/test_ext.php on line 9
2 ''
3 'ile'
4 ''
5 'file'
б)
1 'ext'
2 'ext'
3 'ext'
4 'ext'
5 'ext'
в)
1 'dir/file'
PHP Notice: Undefined index: extension in /tmp/test_ext.php on line 9
2 ''
3 'dir/file'
4 'dir/file'
5 'dir/file'
Выводы:
Если не обращать внимание на notice, то второй способ сработал нормально во всех случаях. Notice устраняется проверкой результата с помощью isset(). Все остальные способы можно использовать с осторожностью. 4й способ дает правильный результат при отсутствии пути (или как минимум точек в пути)
Предложу еще один testcase — файл .htaccess. По моему скромному мнению, в данном случае «.htaccess» — это все же имя файла; pathinfo() из второго способа считает, что это файл без имени, но с расширением. Странно это все.
Иногда люди черезмерно увлекаются написанием собственных каркасов и т. п. возвышаясь в своих глазах и совершенно не подозревая что изобретают велосипед. Просто прочитайте справочник по функциям и вы откроете для себя много нового ранее не виданного и интересного, особенно обратите внимание на функции для работы со строками.
впринципе итак понятно что строковые функции будут самыми быстрыми :) а вообще коофициент полезности такого теста стремится к нулю. ну и как ораторы выше меня уже сказали решения не избавлены ошибок.
Время уходит не на обработку регулярных выражений, а на их компиляцию. Вот если бы у вас имя файла содержало миллионы символов — можно было бы увидеть разницу…
Использовал скомпилированные (/S) врем'я сильно не отличалось почемуто, да там были реальные файлы а не повтор на одном файле, потому експеримент чист!
Всем минусовальщикам спасибо, вы заминусовали вывод из реального експеримента, а новички посчитают что вы все молодцы, а я дурак. Они вам спасибо не скажут.
Результат предсказуем. Какой… не будем говорить кто придумал для PHP регулярные выражения, которые невозможно компилировать — хотелось бы узнать. Регулярные выражения при разборе шаблона строят конечный автомат — это медленно и сложно. К тому же эта часть кода не очень вылизана. А зато вот потом поиск с использованием регулярных выражений происходит мгновенно. Любой нормальный человек скажет что компиляцию регулярных выражений нужно делать один раз, а использовать — столько, сколько нужно. Но в PHP эти две операции объединены в одну!
Это уже проблема PHP, в ньом всьо так реализовывается.
Когдато тестил эту фишку, она действительно работает, но сейчас почемуто не дала результата. Возможно данных много в памяти, я же в скрипт вонал «маленький» масивчик всего то 5 Мб
Это уже проблема PHP, в ньом всьо так реализовывается.
khim вам то же самое сказал, а вы ему — RTFM ;)
компилируемые регулярки в PHP загадочны, и в этом их минус. в остальном PCRE неплох, хотя до .NET-овских ему было бы очень неплохо «подрасти» ибо в них есть очень приятные бонусы которых в PCRE пока нема :(
соррі, khim.
Загадочность не значит «плохо» :)
Не знаю как на счет .NET, а Java дает полный контроль… Но для меня синтаксиса PCRE вполне достаточно (в Java он шыре)
Есть программа визуально показывающая процесс работы регулярного выражения для определенной строки… там все станет намного понятней, к сожалению названия не помню но стать тут про нее была.
Есть огромный архив файлов, который содержит миллионы файлов. Мне нужно было дергать в БД, только те файлы, у которых разрешение было *.bz2 (разрешение может меняться в зависимости от настроек). Вот вам и реальный пример.
И при этом сделать это нужно именно на PHP? :) А что касается экономичности вашего решения, то SelenIT хорошо расписал. Скорость определения расширения будет явно не самой критичной в вашем случае и оптимизировать её не нужно.
Незря кто-то говорил, что карма нужна про запас, или для защиты от всяких хабра-пидаров!
В топике показаны фунции обработки строк (и сравениние их работы по времени) но не работы с расширением файлов. И минус влепили низахуй опять! Быдла на хабре полно, еще и в карму срет.
Господа, вы бесповоротно рехнулись.
Если вам критично выполнение простейшей строковой функции, то почему бы на ассемблере не писать?
Что будет дальше? Будем мерять скорость сложения простых чисел? Или сравнивать скорости смены знака способом ($i = -$k) и ($i = $k * -1)?
Вы меня извините, конечно, но считаю саму статью маразматичной, не говоря уже о столь серьезном ее обсуждении.
Фига себе нанооптимизаторы мне карму снесли :) Теперь придется долго реабилитироваться в комментариях опусами о влиянии регистра букв в переменных на производительность скрипта :)
Расширение файла средствами PHP