За последние 24 часа нас посетили 18359 программистов и 1637 роботов. Сейчас ищут 1682 программиста ...

удобная работа со строками [решение, рассуждение]

Тема в разделе "Решения, алгоритмы", создана пользователем Koc, 6 июн 2009.

  1. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    кстати, можно и через регулярки, даже более красиво. не знаю, быстрее ли. щас накатаю пример.
     
  2. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Какой вариант быстрее - щас проверю :)
    PHP:
    1. <?php
    2.     mb_internal_encoding('UTF-8');
    3.     header('Content-type: text/plain; charset="utf-8"');
    4.     $string = "PHP - мова, яка може !бути! вбудована безпосередньо в html-код сторінок";
    5.  
    6.     $randInverted = preg_replace_callback ("/([\p{L}\p{Nd}])/u", 'randInvert', $string);
    7.  
    8.     function invertCharCase ($c) {
    9.         return ($c == mb_strtolower($c))
    10.             ? mb_strtoupper($c) : mb_strtolower($c);
    11.     }
    12.  
    13.     function randInvert($m) {
    14.         return rand(0, 1) ? invertCharCase($m[0]) : $m[0];
    15.     }
    16.  
    17.     // PhP - мОВА, яКа мОжЕ !БУТИ! ВБУДОВана безпосЕРедНьо В html-КОД СТОріНок
    18.     echo $randInverted;
    19. ?>
     
  3. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    preg мало того, что короче, так еще и быстрее:

    Код (Text):
    1. shock@shock:~/Web/www.tests.lh/htdocs$ cat strInvert.php
    2. <?php                                                    
    3.         mb_internal_encoding('UTF-8');                  
    4.         header('Content-type: text/plain; charset="utf-8"');
    5.         $string = "PHP - мова, яка може !бути! вбудована безпосередньо в html-код сторінок";
    6.  
    7.  
    8.         function caseInvert($string) {
    9.                 $nstr = '';          
    10.                 $c = mb_strlen($string);
    11.                 for ($i = 0; $i < $c; $i++) {
    12.                         $char = mb_substr($string, $i, 1);
    13.                         // if it's lower case make it upper case
    14.                         if ($char == mb_strtolower($char)) {    
    15.                                 $char = mb_strtoupper($char);  
    16.                         // if it's upper than make it lower    
    17.                         } else {                                
    18.                                 $char = mb_strtolower($char);  
    19.                         }                                      
    20.                         $nstr .= $char;                        
    21.                 }                                              
    22.                 return $nstr;                                  
    23.         }                                                      
    24.  
    25.         // randomly capilizes/uncaptilizes chars in a string
    26.         function caseRand($string) {                        
    27.                 $nstr = '';                                
    28.                 $c = mb_strlen($string);                    
    29.                 for ($i = 0; $i < $c; $i++) {              
    30.                         $char = mb_substr($string, $i, 1);  
    31.                         rand(0, 1) ? $char = caseInvert($char) : null;
    32.                         $nstr .= $char;                              
    33.                 }                                                    
    34.                 return $nstr;                                        
    35.         }                                                            
    36.  
    37.         $start = microtime (1);
    38.  
    39.         for ($i = 1000; $i--;) {
    40.                 $randInverted = caseRand($string);
    41.         }                                        
    42.  
    43.         echo (microtime(1) - $start), "\n";
    44. ?>shock@shock:~/Web/www.tests.lh/htdocs$ php -f strInvert.php
    45. 0.651905059814
    46. shock@shock:~/Web/www.tests.lh/htdocs$ php -f strInvert.php
    47. 0.716600894928
    48. shock@shock:~/Web/www.tests.lh/htdocs$ php -f strInvert.php
    49. 0.689832925797
    50. shock@shock:~/Web/www.tests.lh/htdocs$ cat pregInvert.php
    51. <?php
    52.         mb_internal_encoding('UTF-8');
    53.         header('Content-type: text/plain; charset="utf-8"');
    54.         $string = "PHP - мова, яка може !бути! вбудована безпосередньо в html-код сторінок";
    55.  
    56.  
    57.         function invertCharCase ($c) {
    58.                 return ($c == mb_strtolower($c))
    59.                         ? mb_strtoupper($c) : mb_strtolower($c);
    60.         }
    61.  
    62.         function randInvert($m) {
    63.                 return rand(0, 1) ? invertCharCase($m[0]) : $m[0];
    64.         }
    65.  
    66.         $start = microtime (1);
    67.         for ($i = 1000; $i--;) {
    68.                 $randInverted = preg_replace_callback ("/([\p{L}\p{Nd}])/u", 'randInvert', $string);
    69.         }
    70.         echo (microtime(1) - $start), "\n";
    71. ?>shock@shock:~/Web/www.tests.lh/htdocs$ php -f pregInvert.php
    72. 0.586416006088
    73. shock@shock:~/Web/www.tests.lh/htdocs$ php -f pregInvert.php
    74. 0.577327013016
    75. shock@shock:~/Web/www.tests.lh/htdocs$ php -f pregInvert.php
    76. 0.609392166138
    77. shock@shock:~/Web/www.tests.lh/htdocs$ php -f pregInvert.php
    78. 0.552659988403
    79. shock@shock:~/Web/www.tests.lh/htdocs$
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    TheShock
    Передай символом этак тысяч десять и посмотри, что быстрее :)
     
  5. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Первое число - количество символов. Второе - время
    Код (Text):
    1. shock@shock:~$ php -f strInvert.php
    2. 10147 11.3335700035
    3. shock@shock:~$ php -f strInvert.php
    4. 10147 11.2968318462
    5. shock@shock:~$ php -f pregInvert.php
    6. 10147 25.1141960621
    7. shock@shock:~$ php -f pregInvert.php
    8. 10147 24.9959099293
    9. shock@shock:~$ php -f preg2Invert.php
    10. 10147 4.20771503448
    11. shock@shock:~$ php -f preg2Invert.php
    12. 10147 4.31280899048
    PHP:
    1. <?php
    2. /***********************
    3.  * strInvert.php
    4.  ***********************/
    5.     mb_internal_encoding('UTF-8');
    6.     header('Content-type: text/plain; charset="utf-8"');
    7.  
    8.     $string = '...';
    9.  
    10.     echo strlen($string) . ' ';
    11.  
    12.     function caseInvert($string) {
    13.         $nstr = '';
    14.         $c = mb_strlen($string);
    15.         for ($i = 0; $i < $c; $i++) {
    16.             $char = mb_substr($string, $i, 1);
    17.             // if it's lower case make it upper case
    18.             if ($char == mb_strtolower($char)) {
    19.                 $char = mb_strtoupper($char);
    20.             // if it's upper than make it lower
    21.             } else {
    22.                 $char = mb_strtolower($char);
    23.             }
    24.             $nstr .= $char;
    25.         }
    26.         return $nstr;
    27.     }
    28.        
    29.     // randomly capilizes/uncaptilizes chars in a string
    30.     function caseRand($string) {
    31.         $nstr = '';
    32.         $c = mb_strlen($string);
    33.         for ($i = 0; $i < $c; $i++) {
    34.             $char = mb_substr($string, $i, 1);
    35.             rand(0, 1) ? $char = caseInvert($char) : null;
    36.             $nstr .= $char;
    37.         }
    38.         return $nstr;
    39.     }
    40.  
    41.     $start = microtime (1);
    42.  
    43.     for ($i = 100; $i--;) {
    44.         $randInverted = caseRand($string);
    45.     }
    46.  
    47.     echo (microtime(1) - $start), "\n";
    48. ?>
    PHP:
    1. <?php
    2. /***********************
    3.  * pregInvert.php
    4.  ***********************/
    5.     mb_internal_encoding('UTF-8');
    6.     header('Content-type: text/plain; charset="utf-8"');
    7.  
    8.     $string = '...';
    9.  
    10.     echo strlen($string) . ' ';
    11.  
    12.     function invertCharCase ($c) {
    13.         return ($c == mb_strtolower($c))
    14.             ? mb_strtoupper($c) : mb_strtolower($c);
    15.     }
    16.  
    17.     function randInvert($m) {
    18.         return rand(0, 1) ? invertCharCase($m[0]) : $m[0];
    19.     }
    20.  
    21.     $start = microtime (1);
    22.     for ($i = 100; $i--;) {
    23.         $randInverted = preg_replace_callback ("/([\p{L}\p{Nd}])/u", 'randInvert', $string);
    24.     }
    25.     echo (microtime(1) - $start), "\n";
    26. ?>
    PHP:
    1. <?php
    2. /***********************
    3.  * preg2Invert.php
    4.  ***********************/
    5.     mb_internal_encoding('UTF-8');
    6.     header('Content-type: text/plain; charset="utf-8"');
    7.  
    8.     $string = '...';
    9.  
    10.     echo strlen($string) . ' ';
    11.  
    12.     function invertCharCase ($c) {
    13.         return ($c == mb_strtolower($c))
    14.             ? mb_strtoupper($c) : mb_strtolower($c);
    15.     }
    16.  
    17.     function randInvert($m) {
    18.         return rand(0, 1) ? invertCharCase($m[0]) : $m[0];
    19.     }
    20.  
    21.     $start = microtime (1);
    22.     for ($i = 100; $i--;) {
    23.         $randInverted = preg_replace_callback ("/([\p{L}\p{Nd}])/", 'randInvert', $string);
    24.     }
    25.     echo (microtime(1) - $start), "\n";
    26.     // echo $randInverted;
    27. ?>
    Текст скачан с Яндекс-рефератов.
    Единственное отличие версии pregInvert от preg2Invert в модификаторе /u, который сейчас никак не влияет сейчас и вот доказательство:

    Код (Text):
    1. shock@shock:~$ php -f pregInvertMerge.php
    2. тестОВАя СтрокА hErE
    3. ТЕСТОвая строКа hErE
    4. shock@shock:~$ cat pregInvertMerge.php
    PHP:
    1. <?php
    2.         mb_internal_encoding('UTF-8');
    3.         header('Content-type: text/plain; charset="utf-8"');
    4.  
    5.         $string = "Тестовая строка here";
    6.  
    7.         function invertCharCase ($c) {
    8.                 return ($c == mb_strtolower($c))
    9.                         ? mb_strtoupper($c) : mb_strtolower($c);
    10.         }
    11.  
    12.         function randInvert($m) {
    13.                 return rand(0, 1) ? invertCharCase($m[0]) : $m[0];
    14.         }
    15.  
    16.         echo preg_replace_callback ("/([\p{L}\p{Nd}])/u", 'randInvert', $string), "\n";
    17.         echo preg_replace_callback ("/([\p{L}\p{Nd}])/", 'randInvert', $string), "\n";
    18. ?>
    UPD: (актуально для версии до 5.3)
     
  6. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    таак-с. Вроде все правила в cangeCase должны работать. Обновление в репозитории

    я сделал мерж бранчей. Но у меня все равно два бранча. Я хочу удалить "another changeCase", оставить только default что б работать с ней. Как это сделать??
     
  7. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    добавил ф-цию fill (в точности повторяет str_pad, разве что поддерживает и UNICODE)
    http://code.google.com/p/strclass/sourc ... ea07528298

    Про репозиторий: не, ну это просто капец какой-то. Я не пойму, то ли это гугл тупит, то ли я. Я же сделал мерж, на графе видно, что он состоялся и как бы ветки слились. Почему же тогда у меня все равно 2 ветки?

    upd: все же то я дурак. Не туда смержил. Распределенные системы контроля версий весьма прикольны и нетривиальны.
     
  8. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Опечаточка:
    И в конце "encode64" чуть форматирование табами сбилось

    Код (Text):
    1. abstract class StrU extends StrCommon implements IStr
    Не понял, а зачем здесь abstract?

    Почему в take поиск по-умолчанию чувствительный к регистру, а в find - нечувствительный? Получается незакономерность и нестандартизованость
     
  9. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Предварительные тесты по оценке и сравнении скорости работы обертки и встроенных функций
    Цель - узнать потери при использовании обертки для действий, реализуемых встроенными функциями

    Софт:
    Код (Text):
    1. $ uname -sr
    2.     Linux 2.6.28-11-generic
    3. $ php --version
    4.     PHP 5.2.6-3ubuntu4.1 with Suhosin-Patch 0.9.6.2 (cli) (built: Apr 23 2009 14:35:05)
    Хард:
    Код (Text):
    1. Processor : 2x Intel(R) Core(TM)2 Duo CPU  E4500  @ 2.20GHz
    2. Memory : 2061MB
    Вызов скрипта производился из консоли, на каждый тест - отдельный вызов. Листинги некоторых тестов приведены

    Тесты производились на ANSII функциях, потому вначале теста был вызван метод: Str::setMode(Str::ASCII);

    Так как класс находится в стадии разработки, к моменту релиза данная информация может существенно изменится и стать неактуальной.
    Потому публикуется исключительно в ознакомительных целях.

    Функции, которые производят отличный от встроенных в PHP(производят дополнительные вычисления) в тесте не учавствовали

    Ни одна переменная во время теста не пострадала.

    Время подключения файлов: IStr.php, StrA.php, StrU.php через require_once: 0.002 - 0.003 сек

    Если убрать абстракцию и оставить один подключаемый класс (например, только StrU),
    то время подключения можно сократить до 0.001-0.002 сек.

    Итак, строка длиной в 336 символов.

    Код (Text):
    1. # Core-функции
    2. $ php -f index.php
    3.     0.331629037857
    4. $ php -f index.php
    5.     0.293648004532
    6. $ php -f index.php
    7.     0.272671937943
    8.  
    9. # Полноценная обертка
    10. $ php -f index.php
    11.     1.15254306793
    12. $ php -f index.php
    13.     1.3052110672
    14. $ php -f index.php
    15.     1.11312699318
    16.  
    17. # Обертка - один класс
    18. $ php -f index.php
    19.     0.820480108261
    20. $ php -f index.php
    21.     0.799670934677
    22. $ php -f index.php
    23.     0.795886993408
    Мы видим падение сторости выполнения строковых функций при использовании полноценной
    обертки в 4 раза и в 2,7 раза при использовании урезанной обертки.

    Теперь увеличим строку в 30 раз. Строка, длиной в 10080 символов:

    Код (Text):
    1. # Core-функции
    2. $ php -f index.php
    3.     2.82341599464
    4. $ php -f index.php
    5.     2.56636095047
    6. $ php -f index.php
    7.     2.54383087158
    8.  
    9. # Полноценная обертка
    10. $ php -f index.php
    11.     3.0574889183
    12. $ php -f index.php
    13.     3.10743379593
    14. $ php -f index.php
    15.     3.09924817085
    16.  
    17. # Обертка - один класс
    18. $ php -f index.php
    19.     2.87202906609
    20. $ php -f index.php
    21.     2.58693885803
    22. $ php -f index.php
    23.     2.69115591049
    При такой большой строке время выполнения для полноценной обертки увеличилось
    на 16 процентов, а время выполнения урезанной обертки увеличилось на 2%

    Какой вывод можно сделать? Да, обертка ощутимо замедляет время выполнение для маленьких строк.
    Замедление составит 0.5-1 секунду при условии, что в скрипте будет вызвано 180000 строковых функций.
    Стоит учесть, что время выполнения строковых функций в реальном проекте составляет крайне малую долю от выполнения всех функций
    Еще не стоит забывать, что данная обертка расширяет возможности для работы со строками,
    которые, при надобности, все-равно придется писать и выносить в отдельный класс/функции
    Если для вас, несмотря на удобство использования, пару процентов увеличения скорости
    выполнения скрипта - крайне критичны, то рекомендую не использовать эту обертку, а еще лучше - подумать о переходе на ассемблер :)

    Функции:
    PHP:
    1. <?php
    2.  
    3. // Встроенные функции
    4. $s = microtime(1);
    5. for($i=10000;$i--;) {
    6.     stripos($string, 'string');
    7.     strripos($string, 'string');
    8.     strpos($string, 'string');
    9.     strrpos($string, 'string');
    10.     strstr($string, 'string');
    11.     stristr($string, 'string');
    12.     strtoupper($string);
    13.     strtolower($string);
    14.     ucfirst($string);
    15.     ucwords($string);
    16.     base64_encode($string);
    17.     base64_decode($string);
    18.     strlen($string);
    19.     trim($string);
    20.     ltrim($string);
    21.     rtrim($string);
    22.     strrev($string);
    23.     str_pad('string', 400, $string, STR_PAD_BOTH);
    24. }
    25. echo microtime(1) - $s;
    26.  
    27. $s = microtime(1);
    28. for($i=10000;$i--;) {
    29.     Str::find('string', $string); // stripos
    30.     Str::find('string', $string, Str::RIGHT); // strripos
    31.     Str::find('string', $string, Str::LEFT, true); // strpos
    32.     Str::find('string', $string, Str::RIGHT, true); // strrpos
    33.     Str::take('string', $string, Str::RIGHT_WITH); // strstr
    34.     Str::take('string', $string, Str::RIGHT_WITH, false); // stristr
    35.     Str::changeCase($string); // strtoupper
    36.     Str::changeCase($string, Str::ALL, Str::DOWN); // strtolower
    37.     Str::changeCase($string, Str::FIRST); // ucfirst
    38.     Str::changeCase($string, Str::TITLE); // ucwords
    39.     Str::encode64($string); // base64_encode
    40.     Str::decode64($string); // base64_decode
    41.     Str::length($string); // strlen
    42.     Str::trim($string); // trim
    43.     Str::trim($string, NULL, Str::LEFT); // ltrim
    44.     Str::trim($string, NULL, Str::RIGHT); // rtrim
    45.     Str::reverse($string); // strrev
    46.     Str::fill($string, 400, 'string', Str::BOTH); // str_pad
    47. }
    48. echo microtime(1) - $s;
     
  10. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    TheShock
    абстракт - для того, что б никто не пытался создать его экземпляр

    опечатки - да. Они присутствуют. Я после тяжелого трудового дня как никак занимаюсь этой разработкой.
     
  11. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    TheShock
    ээх, тест неутешителен. Нужно писать расширение на сях =)

    сможешь потом это и на utf-8 строках сделать?
     
  12. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Ничего - понемногу исправим.

    encode64 и decode64 в Ансии и Утф версиях одинаковы. Может, стоит совместить?
     
  13. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    PHP:
    1. <?
    2. $s = microtime(1);
    3. for($i=10000;$i--;) {
    4.     mb_stripos($string, 'string');
    5.     mb_strripos($string, 'string');
    6.     mb_strpos($string, 'string');
    7.     mb_strrpos($string, 'string');
    8.     mb_strstr($string, 'string');
    9.     mb_stristr($string, 'string');
    10.     mb_strtoupper($string);
    11.     mb_strtolower($string);
    12.         // ucfirst($string);
    13.         // mb_convert_case($string, MB_CASE_TITLE);
    14.     base64_encode($string);
    15.     base64_decode($string);
    16.     mb_strlen($string);
    17.         // При UTF некорректно работает со вторым параметром: [url=http://habrahabr.ru/blogs/php/45886/]http://habrahabr.ru/blogs/php/45886/[/url]
    18.     trim($string);
    19.     ltrim($string);
    20.     rtrim($string);
    21.         // Отсутствует UTF-версия
    22.         // strrev($string);
    23.         // str_pad('string', 400, $string, STR_PAD_BOTH);
    24. }
    25. echo microtime(1) - $s;
    26.  
    27. $s = microtime(1);
    28. for($i=10000;$i--;) {
    29.     Str::find('string', $string); // stripos
    30.     Str::find('string', $string, Str::RIGHT); // strripos
    31.     Str::find('string', $string, Str::LEFT, true); // strpos
    32.     Str::find('string', $string, Str::RIGHT, true); // strrpos
    33.     Str::take('string', $string, Str::RIGHT_WITH); // strstr
    34.     Str::take('string', $string, Str::RIGHT_WITH, false); // stristr
    35.     Str::changeCase($string); // strtoupper
    36.     Str::changeCase($string, Str::ALL, Str::DOWN); // strtolower
    37.     // Str::changeCase($string, Str::FIRST); // ucfirst
    38.     // Эта функция есть серьезным источником утечки времени. До выяснения обстоятельств и проверки на наркотики не учавствует в тесте
    39.     // Str::changeCase($string, Str::TITLE); // ucwords
    40.     Str::encode64($string); // base64_encode
    41.     Str::decode64($string); // base64_decode
    42.     Str::length($string); // strlen
    43.     Str::trim($string); // trim
    44.     Str::trim($string, NULL, Str::LEFT); // ltrim
    45.     Str::trim($string, NULL, Str::RIGHT); // rtrim
    46.     // Str::reverse($string); // strrev
    47.     // Str::fill($string, 400, 'string', Str::BOTH); // str_pad
    48. }
    49. echo microtime(1) - $s;
    Код (Text):
    1.  
    2.  
    3. # 336 символов, 10000 проходов
    4.     # core
    5. 7.73008608818
    6. 7.71576094627
    7. 7.6764550209
    8.     # wrapper                                                
    9. 7.18259906769
    10. 7.70127987862
    11. 7.10522294044
    12.  
    13. # 10080 символов, 1000 проходов
    14.     # core
    15. 6.93881106377
    16. 6.83931708336
    17. 6.88085699081
    18.     # wrapper
    19. 5.64292311668
    20. 5.64824509621
    21. 5.6463561058
    Результаты для меня неожиданные. Стоит провести тесты и узнать, какая функция делает работу с UTF быстрее при использовании обертки
    Я подозреваю, что это find, так как она единственная не использует встроенные mb_strr?i?pos. Но пойдем с конца и проверим выполнение других функций
    Код (Text):
    1. # trim, ltrim, rtrim
    2.     # core
    3. 0.030268907547
    4. 0.0301129817963
    5. 0.0310060977936
    6.     # wrapper
    7. 0.158612012863
    8. 0.137850046158
    9. 0.174755811691
    10.  
    11. # base64_encode, base64_decode, mb_strlen
    12.     # core
    13. 0.0849959850311
    14. 0.0995881557465
    15. 0.104970932007
    16.     # wrapper
    17. 0.14021897316
    18. 0.163207054138
    19. 0.144799947739
    20.  
    21. # mb_strtoupper, mb_strtolower
    22.     # core
    23. 2.32789087296
    24. 2.33057904243
    25. 2.52379703522
    26.     # wrapper
    27. 2.43806600571
    28. 2.45367383957
    29. 2.54189920425
    30.  
    31. # mb_strstr, mb_stristr
    32.     # core
    33. 1.90595817566
    34. 1.79276394844
    35. 1.88715982437
    36.     # wrapper
    37. 0.459541082382
    38. 0.479822874069
    39. 0.454295158386
    40. # Оппа, вот так неожиданность!
    41.  
    42. # mb_strr?i?pos
    43.     # core
    44. 3.6611559391
    45. 3.55436682701
    46. 3.61103510857
    47.     # wrapper
    48. 3.83161997795
    49. 3.81030297279
    50. 3.89326310158
    Ожидания не оправдались. Код для повторения теста:

    PHP:
    1. <?
    2. $s = microtime(1);
    3. for($i=10000;$i--;) {
    4.     mb_strstr($string, 'string');
    5.     mb_stristr($string, 'string');
    6. }
    7. echo microtime(1) - $s;
    8.  
    9. $s = microtime(1);
    10. for($i=10000;$i--;) {
    11.     Str::take('string', $string, Str::RIGHT_WITH); // strstr
    12.     Str::take('string', $string, Str::RIGHT_WITH, false); // stristr
    13. }
    14. echo microtime(1) - $s;
    15.  
    Чуть позже гляну, чем это может быть вызвано.
     
  14. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    дык эта, совместил еще утром, в 10 30 где-то
    http://code.google.com/p/strclass/sourc ... 4105fe51c#

    че-то я не понял резалты последнего теста
     
  15. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Результаты означают, что стоит проверить работу метода take
     
  16. kostyl

    kostyl Guest

    Конечно, там же mb_ понатыкано...
     
  17. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    PHP:
    1. <?php
    2. header('Content-Type: text/html; charset=utf-8;');
    3.  
    4. $str = '
    5.     Голова моя машет ушами,
    6.     Как крыльями птица.
    7.     Ей на шее ноги
    8.     Маячить больше невмочь.
    9.     Черный человек,
    10.     Черный, черный,
    11.     Черный человек
    12.     На кровать ко мне садится,
    13.     Черный человек
    14.     Спать не дает мне всю ночь.
    15. ';
    16.  
    17. include_once 'class.Str.php';
    18.  
    19. echo $str, "\n\n\n";
    20.  
    21.     Str::take('садится', $str, Str::RIGHT),
    22.     Str::take('садится', $str, Str::RIGHT_WITH),
    23.     Str::take('садится', $str, Str::LEFT),
    24.     Str::take('садится', $str, Str::LEFT_WITH),
    25.     Str::take('черный', $str, Str::LEFT_WITH, false),
    26.     Str::take('черный', $str, Str::LEFT_WITH, true),
    27.     Str::take('синий', $str, Str::LEFT_WITH, true, true),
    28.     Str::take('синий', $str, Str::LEFT_WITH, true, false)
    29. );
    30.  
    я багов не вижу
     
  18. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    kostyl, вопрос: почему обертка в 4 раза быстрее core-функции, какую она использует?
     
  19. хыы... сдается мне, потому что она статика. Я сейчас врать не буду, у меня ночь уже, но попробуй переписать тест с использованием рандомных входящих данных.
     
  20. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
  21. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    ты когда filter перепишешь с нормальными константами? :) Format - хорошо. Но. если человек вызовет чтото типа Str::format(); , то ему вернется ошибка чтото типа: "Undefined index 0 on string 119" - не самая понятная :)

    Думаю, может сейчас хотя бы trigger_error'ы добавить, пока с форматом Exception'ов не определились?
     
  22. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Кхм .. а что это значит?
    В смысле как это название согласуется с тем, что она делает и что она делает?
    По названию непонятно.
     
  23. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Apple
    используется в ф-ции take. Значит взять то, что слева в месте с подстрокой.

    Str::take('садится', $str, Str::LEFT_WITH) // по идее должно выбрать все, что слева от слова садится вместе с этим словом

    а ваще это документируем

    TheShock
    та я по поводу фильтра еще ниче не решил.

    нефиг формат без аргументов вызывыть. Ты еще скажи что будет, если вместо стоки в Str::find я загоню объект.
     
  24. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Ты про take?
    LEFT: Взять все слева от строки
    LEFT_WITH: Взять все слева от строки со строкой
     
  25. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Koc, ну так я и говорю:
    PHP:
    1. <?
    2. public static function format() {
    3.     $args = func_get_args();
    4.     if (func_num_args() == 0) {
    5.         trigger_error("нефиг Str::format без аргументов вызывать.", E_USER_WARNING);
    6.         return;
    7.     }
    8.     if (func_num_args() > 1) {
    9.