Comments 66
из всего предложенного, мне как-то более близок #1, хотя кому как — на способы реализации товарищей нет
0
Использую третий способ, но спасибо за тест!
-1
На мой взгяд это самый бесполезный тест, причем результаты отличаются всего на 0,1 сек. Но по перечисленным способам претензий не имею.
0
В третьем и четвертом примерах опечатки (аргумент $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й способ дает правильный результат при отсутствии пути (или как минимум точек в пути)
Ради интереса протестировал все функции с именами файлов, которые
а) не содержат расширения (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й способ дает правильный результат при отсутствии пути (или как минимум точек в пути)
+10
мне ближе второй способ. Не ожидал что по такой задаче можно тесты делать.
-1
Лабораторка для первого курса…
Давайте еще напишем статью про 10 способов объявить и инициализировать переменную.
Давайте еще напишем статью про 10 способов объявить и инициализировать переменную.
0
а как быть в таких случаях?
file
file.with.extension
.itsfiletoo
readme-1.10.0.384_rev2.392.11
file
file.with.extension
.itsfiletoo
readme-1.10.0.384_rev2.392.11
0
pathinfo($fileName, PATHINFO_EXTENSION);
? o_O
? o_O
+17
Только сам об этом подумал. Думаю это оптимальный вариант.
-1
Иногда люди черезмерно увлекаются написанием собственных каркасов и т. п. возвышаясь в своих глазах и совершенно не подозревая что изобретают велосипед. Просто прочитайте справочник по функциям и вы откроете для себя много нового ранее не виданного и интересного, особенно обратите внимание на функции для работы со строками.
0
Да! :)
0
pathinfo($file, PATHINFO_EXTENSION);
+2
впринципе итак понятно что строковые функции будут самыми быстрыми :) а вообще коофициент полезности такого теста стремится к нулю. ну и как ораторы выше меня уже сказали решения не избавлены ошибок.
0
preg_match(«!\.(\w+)$!», $file, $path);
return $path[1];
return $path[1];
-5
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
Вот и результат :) Не ожидал, что регулярки себя так плохо покажут…
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
Вот и результат :) Не ожидал, что регулярки себя так плохо покажут…
+1
а что если упростить регулярки?
'/\.(.*)$/'
может скорости прибавит?
'/\.(.*)$/'
может скорости прибавит?
0
Время уходит не на обработку регулярных выражений, а на их компиляцию. Вот если бы у вас имя файла содержало миллионы символов — можно было бы увидеть разницу…
+1
Использовал скомпилированные (/S) врем'я сильно не отличалось почемуто, да там были реальные файлы а не повтор на одном файле, потому експеримент чист!
-2
Вот результат скомпилированной:
1: 0.31407904624939
2: 0.4003050327301
3: 0.19335794448853
4: 0.14210796356201
5: 0.3144679069519
6: 0.53428292274475
7: 0.59622716903687
1: 0.31407904624939
2: 0.4003050327301
3: 0.19335794448853
4: 0.14210796356201
5: 0.3144679069519
6: 0.53428292274475
7: 0.59622716903687
0
В getExtension6 нельзя упрощать регулярку, потому как получим мусор (нужна замена всей строки)
0
Результат предсказуем. Какой… не будем говорить кто придумал для PHP регулярные выражения, которые невозможно компилировать — хотелось бы узнать. Регулярные выражения при разборе шаблона строят конечный автомат — это медленно и сложно. К тому же эта часть кода не очень вылизана. А зато вот потом поиск с использованием регулярных выражений происходит мгновенно. Любой нормальный человек скажет что компиляцию регулярных выражений нужно делать один раз, а использовать — столько, сколько нужно. Но в PHP эти две операции объединены в одну!
0
'/..../S' — компилируемая регулярка (RTFM)
0
и где ее, простите, хранить ?!
чтобы заюзать хотя-бы дважды?
чтобы заюзать хотя-бы дважды?
0
Это уже проблема PHP, в ньом всьо так реализовывается.
Когдато тестил эту фишку, она действительно работает, но сейчас почемуто не дала результата. Возможно данных много в памяти, я же в скрипт вонал «маленький» масивчик всего то 5 Мб
Когдато тестил эту фишку, она действительно работает, но сейчас почемуто не дала результата. Возможно данных много в памяти, я же в скрипт вонал «маленький» масивчик всего то 5 Мб
-1
Это уже проблема PHP, в ньом всьо так реализовывается.
khim вам то же самое сказал, а вы ему — RTFM ;)
компилируемые регулярки в PHP загадочны, и в этом их минус. в остальном PCRE неплох, хотя до .NET-овских ему было бы очень неплохо «подрасти» ибо в них есть очень приятные бонусы которых в PCRE пока нема :(
0
Есть программа визуально показывающая процесс работы регулярного выражения для определенной строки… там все станет намного понятней, к сожалению названия не помню но стать тут про нее была.
0
Осталось придумать такую задачу, в которой нужно будет на PHP получить расширение у 50000 файлов ;)
+4
Дельное замечание ;)
0
Приведу реальный пример, с которым я столкнулся.
Есть огромный архив файлов, который содержит миллионы файлов. Мне нужно было дергать в БД, только те файлы, у которых разрешение было *.bz2 (разрешение может меняться в зависимости от настроек). Вот вам и реальный пример.
Есть огромный архив файлов, который содержит миллионы файлов. Мне нужно было дергать в БД, только те файлы, у которых разрешение было *.bz2 (разрешение может меняться в зависимости от настроек). Вот вам и реальный пример.
0
Обойдемся без задачи :) Тест был исключительно для нанооптимизаторов, что бы в их мозгу отложилось «строковые функции быстрее регулярных выражений».
0
Второй способ.
Остальное велосипеды…
Остальное велосипеды…
+1
второй самый тормозный… :)
-2
Зато самый верный
0
Спасибо всем за минусы — за правду всегда бить будут ;)
В компилированом варианте регулярок который провел я в habrahabr.ru/blogs/php/37753/#comment_887934 все подтвердилось.
ну да ладно… че я тут борец за справедливость? ;)
В компилированом варианте регулярок который провел я в habrahabr.ru/blogs/php/37753/#comment_887934 все подтвердилось.
ну да ладно… че я тут борец за справедливость? ;)
0
UFO just landed and posted this here
UFO just landed and posted this here
мде, а если у файла екст док. а а он докХ,
или например екст гиф, а он жипег,
или вообще ект. нету? :-/
или например екст гиф, а он жипег,
или вообще ект. нету? :-/
-3
поэтому надо использовать mime, например чере fileinfo.
0
Незря кто-то говорил, что карма нужна про запас, или для защиты от всяких хабра-пидаров!
В топике показаны фунции обработки строк (и сравениние их работы по времени) но не работы с расширением файлов. И минус влепили низахуй опять! Быдла на хабре полно, еще и в карму срет.
В топике показаны фунции обработки строк (и сравениние их работы по времени) но не работы с расширением файлов. И минус влепили низахуй опять! Быдла на хабре полно, еще и в карму срет.
-4
Господа, вы бесповоротно рехнулись.
Если вам критично выполнение простейшей строковой функции, то почему бы на ассемблере не писать?
Что будет дальше? Будем мерять скорость сложения простых чисел? Или сравнивать скорости смены знака способом ($i = -$k) и ($i = $k * -1)?
Вы меня извините, конечно, но считаю саму статью маразматичной, не говоря уже о столь серьезном ее обсуждении.
Если вам критично выполнение простейшей строковой функции, то почему бы на ассемблере не писать?
Что будет дальше? Будем мерять скорость сложения простых чисел? Или сравнивать скорости смены знака способом ($i = -$k) и ($i = $k * -1)?
Вы меня извините, конечно, но считаю саму статью маразматичной, не говоря уже о столь серьезном ее обсуждении.
+3
В root мне логи! А я как последний дурак тратил на 0,000003643698 секунды больше, используя третий вариант :(
+7
Фига себе нанооптимизаторы мне карму снесли :) Теперь придется долго реабилитироваться в комментариях опусами о влиянии регистра букв в переменных на производительность скрипта :)
+4
Только никому не говорите, а то сочтут вас неквалифицированным ;)
0
Автор, добавь еще 3 способа упомянутых в коментариях, с делай нормальную таблицу сравниния :)
Будем очень благодарны ;)
Будем очень благодарны ;)
0
регулярные выражения нынче не в моде?
0
Я тоже раньше использовал третий, но четвертый мне тоже понравился ;)
0
Sign up to leave a comment.
Расширение файла средствами PHP