stas_t, тогда обрежится и по запятой. А смысл в том, чтобы выдать анонс текста корректно. Как я понял из первого поста.
stas_t, всё-таки, имхо, ты не очень понял цель, а не я . Нужен анонс, а это значит, что: 100% есть текст, 100% в тексте будет знак препинания означающий логический конец (точка, знак вопроса, etc) - ох уж эти правила русского языка. З.Ы. Ты ещё ошибся насчёт "длиной не менее 150 символов". Система иная: вырезать первые 150 символов, но если до знака больше, то вырезать вплоть до первого знака. (Например 156 знаков в итоге, а не ровно 150.) З.З.Ы. Странный тест. Строка в 375 знаков обрабатывается 8 секунд? На калькуляторе? PHP: $pgt = microtime(true); $str = 'Я посмотрел свои заметки, и они мне не понравились. Те три дня, которые я провел на предприятиях фирмы «Ю С. Роботс», я мог бы с таким же успехом просидеть дома, изучая энциклопедию. Как мне сказали, Сьюзен Кэлвин родилась в 1982 году. Значит, теперь ей семьдесят пять. Это известно каждому. Фирме «Ю С. Роботс энд Мекэникел Мэн Корпорэйшн» тоже семьдесят пять лет. Именно в тот год, когда родилась доктор Кэлвин, Лоуренс Робертсби основал предприятие, которое со временем стало самым необыкновенным промышленным гигантом в истории человечества. Но и это тоже известно каждому. В двадцать лет Сьюзен Кэлвин присутствовала на том самом занятии семинара по психоматематике, когда доктор Альфред Лэннинг из «Ю. С. Роботс» продемонстрировал первого подвижного робота, обладавшего голосом. Этот большой, неуклюжий, уродливый робот, от которого разило машинным маслом, был предназначен для использования в проектировавшихся рудниках на Меркурии. Но он умел говорить, и говорить разумно. На этом семинаре Сьюзен не выступала. Она не приняла участия и в последовавших за ним бурных дискуссиях. Мир не нравился этой малообщительной, бесцветной и неинтересной девушке с каменным выражением и гипертрофированным интеллектом, и она сторонилась людей. Но, слушая и наблюдая, она уже тогда почувствовала, как в ней холодным пламенем загорается увлечение. В 2005 году она окончила Колумбийский университет, в поступила в аспирантуру по кибернетике. Изобретенные Робертсоном позитронные мозговые связи превзошли все достигнутое в середине XX века в области вычислительных машин и совершили настоящий переворот. Целые мили реле и фотоэлементов уступили место пористому платиноиридиевому шару размером с человеческий мозг. Сьюзен научилась рассчитывать необходимые параметры, определять возможные значения переменных позитронного «мозга» и разрабатывать такие схемы, чтобы можно было точно предсказать его реакцию на данные раздражители.'; preg_match("/.{150}[^.!;?]*[.!;?]/si", $str.". ", $matches); $str = $matches[0]; echo (microtime(true) - $pgt); На выходе 0.0001060962677. У меня Атлон64 3500+ и 2 гигабайта оперативки. В цикле 1000 раз: 0.0170958042145. Возможно, ты получил как результат что-то типа "8.69820404053E-005", но это не микросекунды. И 5 это не секунд . Как ты провёл тест и чем? preg_* - быстрые функции. Злоупотреблять регекспами не нужно это верно. Но избегать их даже в тех случаях, для которых они созданы - не правильно.
lexa вопрос был: я так понял (я не претендую на конгениальность, но по-русски понимаю без словаря), что максимальное количество символов нельзя перебирать. в вашем же примере не существует верхней границы. нижняя существует -- 150. то есть, если длина строки менее 150, она вообще не совпадёт. это и есть "длиной не менее 150 символов". в чём я ошибся? ценю ваш юмор. рад за вас. у меня PowerPC 700 и 750 метров памяти. как вы, вероятно, понимаете, быстродействие конкретно моей или вашей машины никакого значения не имеет, потому что у каждого свои характеристики. именно поэтому, если мы пытаемся выяснить скорость выполнения определённой операции, мы делаем это относительно скорости выполнения некоторой эталонной операции. в моём примере эталон был -- операция присваивания. если вы посмотрите на результат, то увидите, что позиция empty имеет вес 1.00. это не секунды, это цена операции. вес остальных операций расчитывается относительно этого эталона. считайте, что цена присваивания строки из 375 символов равна 1 рублю. тогда цена кода №2 = 5 рублей 70 копеек. самая дорогая операция -- регулярка в коде № 4 (8,85). это не секунды, это разы. по идее, если вы повторите данные замеры на вашей машине, то получите те же самые коэффициенты. скорость выполнения будет, конечно, другая (ваша машинка управится секунд за 5), но распределение должно сохраниться. а может даже и php-версия выйдет в лидеры (если пятая версия оптимальней четвёрки). попробуем? ща выложу код...
PHP: <?php // BENCHMARK.PHP function microtime_float ($mt) { list ($usec, $sec) = explode (' ', $mt); return ((float)$usec + (float)$sec); } define ('LOOP_MAX', 200000); $bench_name = 'wordwrap first N characters'; // preconfiguration for code snippets define ('MAX_WIDTH', 100); $str = 'Here we got a very very long string which is repeated multiple times to produce a more native look of a news line paragraph. Here we got a very very long string which is repeated multiple times to produce a more native look of a news line paragraph. Here we got a very very long string which is repeated multiple times to produce a more native look of a news line paragraph.'; $a = ''; // /preconfiguration for code snippets // empty cycle... warming up for ($i = 0; $i < LOOP_MAX; $i++) { $a = $str; } $t0 = microtime (); // measuring empty cycle for ($i = 0; $i < LOOP_MAX; $i++) { $a = $str; } $t1 = microtime (); // code snippet 1 for ($i = 0; $i < LOOP_MAX; $i++) { for ($length = MAX_WIDTH ; $str[$length] !== ' ' and $length ; $length-- ); $a = substr ($str, 0, $length); } $t2 = microtime (); // code snippet 2 for ($i = 0; $i < LOOP_MAX; $i++) { $a = substr ($str, 0, MAX_WIDTH-strlen (strrchr (substr ($str, 0, MAX_WIDTH), ' '))); } $t3 = microtime (); // code snippet 3 for ($i = 0; $i < LOOP_MAX; $i++) { list ($a) = explode ('<br>', wordwrap (substr ($str, 0, MAX_WIDTH+1), MAX_WIDTH, '<br>', false)); } $t4 = microtime (); // code snippet 4 for ($i = 0; $i < LOOP_MAX; $i++) { preg_match ('/^.{0,'.MAX_WIDTH.'}\W/', $str, $matches); $a = substr ($matches[0], 0, -1); } $t5 = microtime (); $t0 = microtime_float ($t0); $t1 = microtime_float ($t1); $t2 = microtime_float ($t2); $t3 = microtime_float ($t3); $t4 = microtime_float ($t4); $t5 = microtime_float ($t5); $d0 = $t1-$t0; $d1 = $t2-$t1; $d2 = $t3-$t2; $d3 = $t4-$t3; $d4 = $t5-$t4; $k0 = $d0; printf ("<pre>bench name: %s\n" . " empty : %5.2f\n" . "snippet1: %5.2f\n" . "snippet2: %5.2f\n" . "snippet3: %5.2f\n" . "snippet4: %5.2f\n\n" . "total time: %5.2f sec.\n" . "php ver: %s<br>os: %s</pre>" , $bench_name , $d0/$k0 , $d1/$k0 , $d2/$k0 , $d3/$k0 , $d4/$k0 , $t5-$t0 , PHP_VERSION , PHP_OS ); ?>
Вы так на "вы", что мне стало неудобно "тыкать". Может, всё же на "ты"? Vista и Денвер. З.Ы. Про процессор и память я сказал потому что в тестах их всегда озвучивают. Вот и я хотел "как большой" .
Горбунов Олег, четверть-половину (скачит) процессорного времени и половину оперативной памяти ест Виста. Но она такая красивенькая .
однако, тенденция. в пятёрке "ручной" вариант подсчёта однозначно вышел на первое место. блин, можно было предположить, что разработчики не только новые фичи навешивают, но и оптимизируют всю инфраструктуру... lexa ты мог бы отключить все красивости висты и прогнать замеры ещё раз? уж очень нереально они у тебя выглядят. не знаю как в висте, а в хп в панели управления есть возможность настройки на "максимальную красивость" или "максимальную производительность". по идее на твоей машине тест не должен превышать 7-8 секунд... и ещё, прогони их раз 10, чтобы убедиться, что значения не пляшут.
молча Чего все к красивостям цепляются. А то что там, например, идет проверка кодобезопасности выполнения процесса никого не интересует... Не нравятся красивости - их можно отключить. Хотя если вместо компьютера печатная машинка, чтобы в блокноте скрипты для пхп писать - то да, согласен, виста суксь и все такое
antonn Молча вряд ли получится А Виста и с отключенными красивостями жрет немало. У меня, например, лишней памяти нет, а докупать что-то к машине, чтобы на ней заработала не нужная мне ОСь... мде.
ну никотж ведь не заставляет на нее переходить. Я проблем с производительностью у себя не замечал Виндовоз тоже ругали, когда она вышла, что тормозит и требует крутое железо. Со временем печатные машинки пополамаются, и придется взять нормальный комп. кстати, на 1Гб виста работала без проблем, с включенным Аеро, игралось в bf2142 нормально...
lexa, действительно, хотелось бы увидеть результат прогона с отключенными "красивостями". antonn 512Мб у меня, вроде не печатная машинка. И пока ни для чего, кроме Висты, больше не требуется. А виндовоз и сейчас ругают. Причем, вполне заслуженно, на мой взгляд. Но только все равно это личное дело каждого, не будем тут холивор разводить
А если проверки поменять местами? А то закономерность просматривается. Чем дальше, тем туже Типа уменьшается объем оперативной памяти, т.к. нужно хранить предыдущее.
У меня: bench name: wordwrap first N characters empty : 1.00 snippet2: 9.12 snippet3: 17.16 snippet4: 26.56 snippet1: 7.73 total time: 9.93 sec. php ver: 5.2.1 os: WINNT У хостера на сервере: bench name: wordwrap first N characters empty : 1.00 snippet2: 8.84 snippet3: 22.47 snippet4: 15.84 snippet1: 6.74 total time: 7.54 sec. php ver: 4.4.7 os: FreeBSD Т.е. 1-ый вариант впереди даже если он последний. А вот что интересно, у хостера 3-ий вариант работает дольше, чем 4-й.
А вот еще у того же хостера. Здесь уже третий вариант победил не только 4-ый но даже 2-ой. bench name: wordwrap first N characters empty : 1.00 snippet1: 6.44 snippet2: 10.94 snippet3: 7.36 snippet4: 12.47 total time: 7.64 sec. php ver: 4.4.7 os: FreeBSD
Штаны гонять замеры на расшаренном сервере бессмысленно. вы никогда не знаете, сколько подключений в каждый конкретный момент обрабатывает сервер. например, если в середине теста пришло новое подключение, скорость обработки для конкретного скрипта упадёт. к тому же если хостер узнает, что ваши скрипты грузят сервак на 100% (что и происходит в случае замера производительности), он вообще может вас отключить. и правильно сделает. внимание для всех, кто будет гонять тесты. не делайте этого на хостинге! тесты загружают сервер на 100%! запускайте тесты только на машине, которую вы контролируете. при этом, желательно, остановите вспомогательные процессы и закройте другие приложения, включая браузер. тесты лучше гонять из командной строки... настройте машину на оптимальную производительность, отключите красивости (если ещё не настроили). ну вот как-то так... типа легальная отмаза
Код (Text): [Sergey89@localhost html]$ php benchmark.php bench name: wordwrap first N characters empty : 1.00 snippet1: 7.64 snippet2: 9.84 snippet3: 15.38 snippet4: 16.71 total time: 6.06 sec. php ver: 5.2.1 os: Linux [root@localhost html]# uname -a Linux localhost 2.6.17-13mdv #1 SMP Fri Mar 23 19:03:31 UTC 2007 i686 Intel(R) Pentium(R) 4 CPU 1.70GHz GNU/Linux
на локале (винда без красивостей) На серваке: stas_t на серваке тест загружает только один процессор.
Я тоже хочу Код (Text): alex:/home/alex# php benchmark.php bench name: wordwrap first N characters empty : 1.00 snippet1: 7.55 snippet2: 8.82 snippet3: 16.16 snippet4: 22.43 total time: 7.95 sec. php ver: 5.2.0-8+etch7 os: Linux P3M 1,2GHz