Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: PHP жжот

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: PHP собственно, жжот. Причём так, что я офигел...
Haron
Отправлено: 25 Апреля, 2011 - 04:42:54
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




В общем друзья, такое дело:

Есть у меня один скриптец, разбивающий длинный текст на массив из отдельных слов. Так вот, в этой функции используется условие, при котором лесом идут все слова короче чем X символов. И там используется функция измерения длины слова. Но к чему это я... А к тому, что вот функция-обёртка strlen, для работы с русским текстом:

PHP:
скопировать код в буфер обмена
  1.  
  2. function utf8_strlen($str)
  3. {
  4.         if (exstension_loaded('mbstring'))
  5.         {
  6.                 return mb_strlen($str, 'utf-8');
  7.         }
  8.         else
  9.         {              
  10.                 return strlen(utf8_decode($str));
  11.         }
  12. }


Меня убило то, что когда используешь mb_strlen напрямую без обёрток - скрипт обрабатывает текст из 4000 слов за 0.2 секунды.

А если я подключаю вместо неё вышеозначеную - обёртку (мало-ли, вдруг на целевом хостинге нету расширения mbstring) - скрипт над тем-же текстом потеет... АЖ ЦЕЛЫХ ПОЛТОРЫ СЕКУНДЫ!!!

Вопрос?
Это чё за шляпа???
(Добавление)
Однако...

Заменив exstension_loaded() на function_exists() - скорость повысилась аж в два раза. Но всё равно, в три раза медленнее чем без обёртки.

Долгое это дело оказывается, независимость от подключеных расширений PHP.

И кстати... На этом форуме, да и на многих других - юзается phpbb, так вот, там есть такая весёлая библиотека функций - utf8_tools.php А там этих exstension_loaded() - OVER9000... Вот вам и идея по оптимизации данного форумного движка.

Комментарии как говорится, излишни...

*Пошёл оптимизировать подконтрольный форум... -)*

(Отредактировано автором: 25 Апреля, 2011 - 04:59:14)



-----
И чё?
 
 Top
morosit
Отправлено: 25 Апреля, 2011 - 06:36:51
Post Id



Посетитель


Покинул форум
Сообщений всего: 307
Дата рег-ции: Июль 2010  
Откуда: Казахстан


Помог: 4 раз(а)




Haron пишет:
На этом форуме, ...- юзается phpbb,


а вот эта строчка в самом низу:
Powered by ExBB FM 1.0 RC1. InvisionExBB
 
 Top
Haron
Отправлено: 25 Апреля, 2011 - 06:44:18
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Действительно. Ну им тогда повезло Радость Радость


-----
И чё?
 
 Top
EuGen Администратор
Отправлено: 25 Апреля, 2011 - 07:27:33
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Haron пишет:
if (exstension_loaded('mbstring'))

Любопытно, а что это за функция такая? Я знаю только такую:
http://ru2.php.net/manual/en/fun...nsion-loaded.php


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Haron
Отправлено: 25 Апреля, 2011 - 08:42:57
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




EuGen пишет:
Haron пишет:
if (exstension_loaded('mbstring'))

Любопытно, а что это за функция такая? Я знаю только такую:
http://ru2.php.net/manual/en/function.extension-loaded.php
\

А это обёртка для неё :-D

(Отредактировано автором: 25 Апреля, 2011 - 08:44:02)



-----
И чё?
 
 Top
EuGen Администратор
Отправлено: 25 Апреля, 2011 - 08:48:41
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Так дело быть может, как раз в ней? extension_loaded прекомпилирована, а вот обертка - нет.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Haron
Отправлено: 25 Апреля, 2011 - 09:01:53
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




EuGen пишет:
Так дело быть может, как раз в ней? extension_loaded прекомпилирована, а вот обертка - нет.


Я пошутил про обёртку... А в записи - ошибся, код вручную писал, без копипаста, торопился.
Попозже пару тестов выложу...
(Добавление)
Итак - результаты теста:

Использовался следующий скрипт:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $start_1_time = microtime(true);
  4. $count = 0;
  5.  
  6. function test_strlen_one($text)
  7. {
  8.         if (extension_loaded('mbstring'))
  9.         {
  10.                 return mb_strlen($text);
  11.         }
  12. }
  13.  
  14. if (isset($_POST['submit']))
  15. {
  16.         $array = explode(' ', $_POST['text']);
  17.         foreach ($array as $key => $value)
  18.         {
  19.                 $count = $count + test_strlen_one($value);
  20.         }
  21. }
  22.  
  23. ?>
  24.  
  25. <form method="post">
  26.         <textarea name="text" cols="80" rows="40"><?=$count?></textarea>
  27.         <input type="submit" name="submit" value="start process" />
  28. </form>
  29.  
  30. <?PHP
  31. echo microtime(true)-$start_1_time . '<br />';
  32. ?>


- В качестве содержимого textarea - вставлялось 10 копий первой главы книги В. И. Ленина "Материализм и эмпириокритицизм" (http://www[dot]souz[dot]info/library/lenin/len14v02[dot]htm )

Тест первый:
- Использование обёртки test_strlen_one() с проверкой на доступность расширения mbstring
- Результат выполнения: 0.81 секунда

Тест второй
- Обёртка в цикле foreach была заменена на прямой вызов функции mb_strlen()
- Результат выполнения: 0.32 секунды

Конфигурация сервера:
Nginx 0.8.54 (Win32) FastCGI, PHP 5.2.14 with eAccelerator extension.


-----
И чё?
 
 Top
morosit
Отправлено: 25 Апреля, 2011 - 10:44:53
Post Id



Посетитель


Покинул форум
Сообщений всего: 307
Дата рег-ции: Июль 2010  
Откуда: Казахстан


Помог: 4 раз(а)




А, что удивительного в том что:
Цитата:
Использование обёртки test_strlen_one() с проверкой на доступность расширения
повышает время выполнения скрипта
 
 Top
EuGen Администратор
Отправлено: 25 Апреля, 2011 - 11:24:12
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Можете немного оптимизировать так - сначала, до цикла:
$function=extension_loaded('mbstring')?'mb_strlen':'ваша обертка';
И в цикле вызывать $function($value)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Haron
Отправлено: 25 Апреля, 2011 - 11:24:48
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




morosit пишет:
А, что удивительного в том что:
Цитата:
Использование обёртки test_strlen_one() с проверкой на доступность расширения
повышает время выполнения скрипта


В том-то и дело, что ничего удивительного. Однако, подобные проверки - встречаются почти повсеместно.
(Добавление)
С оптимизацией EuGen'a - выполнило за 0.41 секунду


-----
И чё?
 
 Top
EuGen Администратор
Отправлено: 25 Апреля, 2011 - 12:12:29
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Да, кстати. Сколько раз тестируете (чтобы подсчитать среднее время)?.. меньше, скажем, 10000 смысла нет.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Stierus Супермодератор
Отправлено: 25 Апреля, 2011 - 12:50:50
Post Id



Рекордсмен по количеству сообщений за 7 дней


Покинул форум
Сообщений всего: 2132
Дата рег-ции: Дек. 2008  
Откуда: Москваль


Помог: 52 раз(а)




Возможно, глупый вопрос, но если результат работы
Вас устраивает, что мешает 1 раз, в самом начале, перед циклом обработки, прогнать всю строку с текстом через utf8_decode($str); (если это нужно, конечно) и потом смотреть обычным strlen ?
 
My status
 Top
Haron
Отправлено: 25 Апреля, 2011 - 14:42:21
Post Id



Частый гость


Покинул форум
Сообщений всего: 197
Дата рег-ции: Июнь 2010  
Откуда: Оттуда


Помог: 5 раз(а)




Цитата:
Да, кстати. Сколько раз тестируете (чтобы подсчитать среднее время)?.. меньше, скажем, 10000 смысла нет.


1000 прогонов на модифицированном варианте скрипта. (файло с текстом читает с диска 1 раз, запуск через CLI).

Цитата:
Но если результат работы вас устраивает


Да результат-то устраивает, вполне, но речь не о том. Кстати позже и это замерю Улыбка


-----
И чё?
 
 Top
Ch_chov
Отправлено: 25 Апреля, 2011 - 16:30:52
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




PHP:
скопировать код в буфер обмена
  1. function test_strlen_one($text) {
  2.   return function_exists('mb_strlen') ? mb_strlen($text) : strlen(preg_replace("/[\x80-\xBF]/", '', $text));
  3. }

Проверку mb_string можно кэшировать с помощью статической переменной, но не думаю, что это имеет смысл.
function_exists довольно быстрая функция.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB