Pull to refresh

Comments 66

из всего предложенного, мне как-то более близок #1, хотя кому как — на способы реализации товарищей нет
я бы подумал сколько действий выполнится в 1 случае и откинул бы сразу, выглядит он как-то вроде мы трактором копаем червей для рыбалки.
Использую третий способ, но спасибо за тест!
На мой взгяд это самый бесполезный тест, причем результаты отличаются всего на 0,1 сек. Но по перечисленным способам претензий не имею.
Не отрицаю, но сделал его во избежании комментариев с утверждением того, что тот или иной метод в разы быстрее. Я лишь подтвердил, что способы равнозначны.
>причем результаты отличаются всего на 0,1 сек.
на 0.1сек. на 50000-кратном цикле :)
В третьем и четвертом примерах опечатки (аргумент $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() из второго способа считает, что это файл без имени, но с расширением. Странно это все.
мне ближе второй способ. Не ожидал что по такой задаче можно тесты делать.
Лабораторка для первого курса…
Давайте еще напишем статью про 10 способов объявить и инициализировать переменную.
А я где-то написал, что это мой научный труд?
P.S. Давайте. Инициализация переменной важный и обязательный момент.
а как быть в таких случаях?
file
file.with.extension
.itsfiletoo
readme-1.10.0.384_rev2.392.11
Только сам об этом подумал. Думаю это оптимальный вариант.
Иногда люди черезмерно увлекаются написанием собственных каркасов и т. п. возвышаясь в своих глазах и совершенно не подозревая что изобретают велосипед. Просто прочитайте справочник по функциям и вы откроете для себя много нового ранее не виданного и интересного, особенно обратите внимание на функции для работы со строками.
впринципе итак понятно что строковые функции будут самыми быстрыми :) а вообще коофициент полезности такого теста стремится к нулю. ну и как ораторы выше меня уже сказали решения не избавлены ошибок.
preg_match(«!\.(\w+)$!», $file, $path);
return $path[1];
опс, ошибку понял: \w сюда не подходит.
вы пытаетесь из пушки по мухам стрелять
function getExtension6($filename) {
return preg_replace('/^.*\.(.*)$/U', '$1', $filename);
}

function getExtension7($filename) {
return preg_match('/\.(.*)$/U', $filename, $matches)? $matches[1]: '';
}

1: 0.34617495536804
2: 0.39701700210571
3: 0.19387984275818
4: 0.14295220375061
5: 0.31544399261475
6: 0.56111097335815
7: 0.59882402420044

Вот и результат :) Не ожидал, что регулярки себя так плохо покажут…
а что если упростить регулярки?
'/\.(.*)$/'
может скорости прибавит?
Время уходит не на обработку регулярных выражений, а на их компиляцию. Вот если бы у вас имя файла содержало миллионы символов — можно было бы увидеть разницу…
Использовал скомпилированные (/S) врем'я сильно не отличалось почемуто, да там были реальные файлы а не повтор на одном файле, потому експеримент чист!
Всем минусовальщикам спасибо, вы заминусовали вывод из реального експеримента, а новички посчитают что вы все молодцы, а я дурак. Они вам спасибо не скажут.
Вот результат скомпилированной:
1: 0.31407904624939
2: 0.4003050327301
3: 0.19335794448853
4: 0.14210796356201
5: 0.3144679069519
6: 0.53428292274475
7: 0.59622716903687
В getExtension6 нельзя упрощать регулярку, потому как получим мусор (нужна замена всей строки)
Результат предсказуем. Какой… не будем говорить кто придумал для PHP регулярные выражения, которые невозможно компилировать — хотелось бы узнать. Регулярные выражения при разборе шаблона строят конечный автомат — это медленно и сложно. К тому же эта часть кода не очень вылизана. А зато вот потом поиск с использованием регулярных выражений происходит мгновенно. Любой нормальный человек скажет что компиляцию регулярных выражений нужно делать один раз, а использовать — столько, сколько нужно. Но в PHP эти две операции объединены в одну!
'/..../S' — компилируемая регулярка (RTFM)
и где ее, простите, хранить ?!
чтобы заюзать хотя-бы дважды?
Это уже проблема PHP, в ньом всьо так реализовывается.
Когдато тестил эту фишку, она действительно работает, но сейчас почемуто не дала результата. Возможно данных много в памяти, я же в скрипт вонал «маленький» масивчик всего то 5 Мб
Это уже проблема PHP, в ньом всьо так реализовывается.

khim вам то же самое сказал, а вы ему — RTFM ;)
компилируемые регулярки в PHP загадочны, и в этом их минус. в остальном PCRE неплох, хотя до .NET-овских ему было бы очень неплохо «подрасти» ибо в них есть очень приятные бонусы которых в PCRE пока нема :(
соррі, khim.
Загадочность не значит «плохо» :)
Не знаю как на счет .NET, а Java дает полный контроль… Но для меня синтаксиса PCRE вполне достаточно (в Java он шыре)
Есть программа визуально показывающая процесс работы регулярного выражения для определенной строки… там все станет намного понятней, к сожалению названия не помню но стать тут про нее была.
The Regex Coach — одна из таких программ.
Осталось придумать такую задачу, в которой нужно будет на PHP получить расширение у 50000 файлов ;)
Дельное замечание ;)
Приведу реальный пример, с которым я столкнулся.

Есть огромный архив файлов, который содержит миллионы файлов. Мне нужно было дергать в БД, только те файлы, у которых разрешение было *.bz2 (разрешение может меняться в зависимости от настроек). Вот вам и реальный пример.
UFO just landed and posted this here
И при этом сделать это нужно именно на PHP? :) А что касается экономичности вашего решения, то SelenIT хорошо расписал. Скорость определения расширения будет явно не самой критичной в вашем случае и оптимизировать её не нужно.
Обойдемся без задачи :) Тест был исключительно для нанооптимизаторов, что бы в их мозгу отложилось «строковые функции быстрее регулярных выражений».
Тогда вы и сами должны понимать, что это не самый лучший пример для них :)
Второй способ.
Остальное велосипеды…
второй самый тормозный… :)
Зато самый верный
Такой критерий работает в маленьких сайтиках, а высоконагруженные системы такого не терпят, — прийдется перекрывать железом…
Спасибо всем за минусы — за правду всегда бить будут ;)

В компилированом варианте регулярок который провел я в habrahabr.ru/blogs/php/37753/#comment_887934 все подтвердилось.

ну да ладно… че я тут борец за справедливость? ;)
UFO just landed and posted this here
UFO just landed and posted this here
это ты про свой камент?
мде, а если у файла екст док. а а он докХ,
или например екст гиф, а он жипег,
или вообще ект. нету? :-/
поэтому надо использовать mime, например чере fileinfo.
Незря кто-то говорил, что карма нужна про запас, или для защиты от всяких хабра-пидаров!
В топике показаны фунции обработки строк (и сравениние их работы по времени) но не работы с расширением файлов. И минус влепили низахуй опять! Быдла на хабре полно, еще и в карму срет.
Мде… no comments
ps: пидары — здохнуте от спида
UFO just landed and posted this here
UFO just landed and posted this here
Господа, вы бесповоротно рехнулись.
Если вам критично выполнение простейшей строковой функции, то почему бы на ассемблере не писать?
Что будет дальше? Будем мерять скорость сложения простых чисел? Или сравнивать скорости смены знака способом ($i = -$k) и ($i = $k * -1)?
Вы меня извините, конечно, но считаю саму статью маразматичной, не говоря уже о столь серьезном ее обсуждении.
В root мне логи! А я как последний дурак тратил на 0,000003643698 секунды больше, используя третий вариант :(
Фига себе нанооптимизаторы мне карму снесли :) Теперь придется долго реабилитироваться в комментариях опусами о влиянии регистра букв в переменных на производительность скрипта :)
UFO just landed and posted this here
Я в разных дискуссиях участвую и моя карма тоже прыгает как кардиограмма :) +4 в карму
Только никому не говорите, а то сочтут вас неквалифицированным ;)
Автор, добавь еще 3 способа упомянутых в коментариях, с делай нормальную таблицу сравниния :)
Будем очень благодарны ;)
регулярные выражения нынче не в моде?
Я тоже раньше использовал третий, но четвертый мне тоже понравился ;)
Sign up to leave a comment.

Articles