За последние 24 часа нас посетили 22627 программистов и 1108 роботов. Сейчас ищет 641 программист ...

Кружок любопытных извращенцев :)

Тема в разделе "Прочие вопросы по PHP", создана пользователем Psih, 9 июн 2009.

  1. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Подтверждение того, что preg_* работает быстрее ereg_*
    Мы специально не используем никаких сложных выражений, мы используем простейшие строки
    поиска, даже без захвата.

    Код (PHP):
    1. <?php
    2.  
    3. $string = '';
    4.  
    5. for($i = 0; $i <= 10000; $i++) {
    6.     $string .= 'abcdef[replacement]ghijklmn';
    7. }
    8.  
    9. $start[1] = microtime(true);
    10.  
    11. $abc = ereg_replace('replacement', 'REPLACED', $string);
    12.  
    13. echo microtime(true) - $start[1].'<br>';
    14. $start[2] = microtime(true);
    15.  
    16. $abc = preg_replace('/replacement/i', 'REPLACED', $string);
    17.  
    18. echo microtime(true) - $start[2].'<br>';
    19.  
    20. ?>
    Результат:
    Код (Text):
    1. 10.284742832184
    2. 0.013195037841797
    Комментарии излишни :)
     
  2. vasa_c

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

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Задумайтесь, кстати, что влияет. Подавление сообщения об ошибке или сама ошибка.

    Особо впечатлительные интерпретируют эти выводы как - использования собаки замедляет ваши сценарии в 9 раз.
     
  3. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    ребята, у PHP есть одна неприятная для подсчетов особенность:
    Код (PHP):
    1. <?php
    2.  
    3. $string = '';
    4. $start = array();
    5.  
    6. for($i = 0; $i <= 100; $i++) {
    7.     $string .= 'abcdef[replacement]ghijklmn';
    8. }
    9. $start[1] = microtime(true);
    10. for($i = 0; $i <= 10000; $i++) {
    11.     $abc = preg_replace('/replacement/i', 'REPLACED', $string);
    12. }
    13. echo microtime(true) - $start[1].'<br>';
    14. $start[2] = microtime(true);
    15. for($i = 0; $i <= 10000; $i++) {
    16.     $abc = preg_replace('/replacement/i', 'REPLACED', $string);
    17. }
    18. echo microtime(true) - $start[2].'<br>';
    19. ?>
    Стабильный результат:
    Код (Text):
    1. 0.453883886337
    2. 0.365996837616
    Тот код, который проверяется первым - всегда кажется более медленным, потому стоит учитывать это и проверять в два разных скрипта.

    Пример с preg_ ereg_:
    Код (Text):
    1.  
    2. Ereg - первый
    3. e 0.856323003769
    4. p 0.037899017334
    5. Ereg - второй
    6. p 0.0398910045624
    7. e 0.797086000443
    На небольших разницах(до 50%) это способно сыграть критическую роль (проверил на сообственном опыте). Естественно, тормознутости ерега это не отменяет.
     
  4. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Надеюсь, тест проводился в консоли?

    При тестировании необходимо отключать все программы, которые могут 20-100% на совсем незначительный срок (логгеры, нотайсеры, чаты, аськи, почтовики), а так же фаерволлы, антивирусы...
     
  5. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Kreker, код выше:
    Код (Text):
    1. shock@shock:~$ php -f /home/shock/Web/test.php
    2. 0.46493601799
    3. 0.371444940567
    4. shock@shock:~$ php -f /home/shock/Web/test.php
    5. 0.451848983765
    6. 0.376871109009
    7. shock@shock:~$ php -f /home/shock/Web/test.php
    8. 0.421268939972
    9. 0.370434045792
    Сомневаюсь, что так стабильно могут влиять программы
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    TheShock
    Чтобы этого избежать, достаточно для каждого варианта запускать сркипт отдельно.

    ЗЫ. Psih а де ссылки? :)
     
  7. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    ВС, про это я и говорю :)
     
  8. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Обновленно, натыкал ссылок в перывый пост. Продолжаем постить :)
     
  9. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Тема теста сегодня вполне прикладная и напрямую повлияла на метод вызова методов класса.

    Тема теста: $this->$call($arg) vs call_user_func(array($this, $call), $arg) vs switch ($call) { case 'method1': $this->method1($arg); break; }.

    Сделал 2 теста - первый когда имя метода совпадает с тем, что в $call. Второй, это когда имя метода имеет префикс, который мы добавляем перед $call при вызове.


    Тест первый:
    Код (PHP):
    1. <?php
    2.  
    3. define('MAX', 100000);
    4.  
    5. class Test {
    6.     
    7.     final public function __construct()
    8.     {
    9.     }
    10.     
    11.     final public function __destruct()
    12.     {
    13.     }
    14.     
    15.     final public function run_test1($current)
    16.     {
    17.         $this->$current('test1');
    18.     }
    19.     
    20.     final public function run_test2($current)
    21.     {
    22.         call_user_func(array($this, $current), 'test2');
    23.     }
    24.     
    25.     final public function run_test3($current)
    26.     {
    27.         switch ($current) {
    28.             case 'test1':
    29.                 $this->test1('test3');
    30.                 break;
    31.                 
    32.             case 'test2':
    33.                 $this->test2('test3');
    34.                 break;
    35.             
    36.             case 'test3':
    37.                 $this->test3('test3');
    38.                 break;
    39.         }
    40.     }
    41.     
    42.     final private function test1($param)
    43.     {
    44.     }
    45.     
    46.     final private function test2($param)
    47.     {
    48.     }
    49.     
    50.     final private function test3($param)
    51.     {
    52.     }
    53. }
    54.  
    55. $test = new Test();
    56.  
    57. $time = microtime(true);
    58. for ($i = 0; $i < MAX; ++$i) {
    59.     $test->run_test1('test1');
    60.     $test->run_test1('test2');
    61.     $test->run_test1('test3');
    62. }
    63. $time2 = microtime(true);
    64. echo 'Test with $this->$k: '.number_format($time2 - $time, 10, '.', '').PHP_EOL.PHP_EOL;
    65.  
    66. $time = microtime(true);
    67. for ($i = 0; $i < MAX; ++$i) {
    68.     $test->run_test2('test1');
    69.     $test->run_test2('test2');
    70.     $test->run_test2('test3');
    71. }
    72. $time2 = microtime(true);
    73. echo 'Test with call_user_func: '.number_format($time2 - $time, 10, '.', '').PHP_EOL.PHP_EOL;
    74.  
    75. $time = microtime(true);
    76. for ($i = 0; $i < MAX; ++$i) {
    77.     $test->run_test3('test1');
    78.     $test->run_test3('test2');
    79.     $test->run_test3('test3');
    80. }
    81. $time2 = microtime(true);
    82. echo 'Test with switch: '.number_format($time2 - $time, 10, '.', '').PHP_EOL.PHP_EOL; 
    Результаты:
    Код (Text):
    1. Test with $this->$k:      8.2953500748
    2. Test with call_user_func: 8.9828510284
    3. Test with switch:         13.3120439053

    Тест 2 (этот меня интересовал больше, т.к. это конкретно мой случай). Дополнительно добавил тест с __call:
    Код (PHP):
    1. <?php
    2.  
    3. define('MAX', 100000);
    4.  
    5. class Test {
    6.     
    7.     final public function __construct()
    8.     {
    9.     }
    10.     
    11.     final public function __destruct()
    12.     {
    13.     }
    14.     
    15.     final public function run_test1($current)
    16.     {
    17.         $this->{'event_'.$current}('test1');
    18.     }
    19.     
    20.     final public function run_test2($current)
    21.     {
    22.         call_user_func(array($this, 'event_'.$current), 'test2');
    23.     }
    24.     
    25.     final public function run_test3($current)
    26.     {
    27.         switch ($current) {
    28.             case 'test1':
    29.                 $this->event_test1('test3');
    30.                 break;
    31.                 
    32.             case 'test2':
    33.                 $this->event_test2('test3');
    34.                 break;
    35.             
    36.             case 'test3':
    37.                 $this->event_test3('test3');
    38.                 break;
    39.         }
    40.     }
    41.     
    42.     final public function __call($method, $params)
    43.     {
    44.         $this->{'event_'.$method}($params[0]);
    45.     }
    46.     
    47.     final public function run_test4($current)
    48.     {
    49.         $this->$current('test4');
    50.     }
    51.     
    52.     final private function event_test1($param)
    53.     {
    54.     }
    55.     
    56.     final private function event_test2($param)
    57.     {
    58.     }
    59.     
    60.     final private function event_test3($param)
    61.     {
    62.     }
    63. }
    64.  
    65. $test = new Test();
    66.  
    67. $time = microtime(true);
    68. for ($i = 0; $i < MAX; ++$i) {
    69.     $test->run_test1('test1');
    70.     $test->run_test1('test2');
    71.     $test->run_test1('test3');
    72. }
    73. $time2 = microtime(true);
    74. echo 'Test with $this->$k: '.number_format($time2 - $time, 10, '.', '').PHP_EOL.PHP_EOL;
    75.  
    76. $time = microtime(true);
    77. for ($i = 0; $i < MAX; ++$i) {
    78.     $test->run_test2('test1');
    79.     $test->run_test2('test2');
    80.     $test->run_test2('test3');
    81. }
    82. $time2 = microtime(true);
    83. echo 'Test with call_user_func: '.number_format($time2 - $time, 10, '.', '').PHP_EOL.PHP_EOL;
    84.  
    85. $time = microtime(true);
    86. for ($i = 0; $i < MAX; ++$i) {
    87.     $test->run_test3('test1');
    88.     $test->run_test3('test2');
    89.     $test->run_test3('test3');
    90. }
    91. $time2 = microtime(true);
    92. echo 'Test with switch: '.number_format($time2 - $time, 10, '.', '').PHP_EOL.PHP_EOL;
    93.  
    94. $time = microtime(true);
    95. for ($i = 0; $i < MAX; ++$i) {
    96.     $test->run_test4('test1');
    97.     $test->run_test4('test2');
    98.     $test->run_test4('test3');
    99. }
    100. $time2 = microtime(true);
    101. echo 'Test with __call: '.number_format($time2 - $time, 10, '.', '').PHP_EOL.PHP_EOL; 
    Результаты:
    Код (Text):
    1. Test with $this->$k:      8.5323679447
    2. Test with call_user_func: 9.2136681080
    3. Test with switch:         13.2927098274
    4. Test with __call:         12.6840810776
    Итог: $this->{'prefix_'.$call}() - герой дня. call_user_func тоже подходит. switch case вобщем-то как и ожидалось - аутсайдер. __call как ни странно оказался сильно медленее, я ожидал меньшее отставание. Вобщем-то __call используется для method overload и его разумное использование вряд-ли скажется на вашем проекте.

    Со switch case есть ещё один момент - чем больше case'ов, тем медленее будет оно работать. В моём случае ожидается до 30-40 case'ов, что я думаю скажется зверски, особенно если учитывать что конкретно эта часть будет дёргаться AJAX'ом раз в 5 секунд каждый юзером, а онлайн планируется порядка 3-4 тысяч для начала, в последствии до 20-25 тысяч.
     
  10. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Вывод о switch case подтверждается следующим тестом:

    Код (PHP):
    1. <?php
    2.  
    3. define('MAX', 100000);
    4.  
    5. class Test {
    6.     
    7.     final public function __construct()
    8.     {
    9.     }
    10.     
    11.     final public function __destruct()
    12.     {
    13.     }
    14.     
    15.     final public function run_test1($current)
    16.     {
    17.         $this->{'event_'.$current}('test1');
    18.     }
    19.     
    20.     final public function run_test2($current)
    21.     {
    22.         call_user_func(array($this, 'event_'.$current), 'test2');
    23.     }
    24.     
    25.     final public function run_test3($current)
    26.     {
    27.         switch ($current) {
    28.             case 'test1':
    29.                 $this->event_test1('test3');
    30.                 break;
    31.                 
    32.             case 'test2':
    33.                 $this->event_test2('test3');
    34.                 break;
    35.             
    36.             case 'test3':
    37.                 $this->event_test3('test3');
    38.                 break;
    39.                 
    40.             case 'test4':
    41.                 $this->event_test4('test3');
    42.                 break;
    43.             
    44.             case 'test5':
    45.                 $this->event_test5('test3');
    46.                 break;
    47.                 
    48.             case 'test6':
    49.                 $this->event_test6('test3');
    50.                 break;
    51.                 
    52.             case 'test7':
    53.                 $this->event_test7('test3');
    54.                 break;
    55.                 
    56.             case 'test8':
    57.                 $this->event_test8('test3');
    58.                 break;
    59.                 
    60.             case 'test9':
    61.                 $this->event_test9('test3');
    62.                 break;
    63.                 
    64.             case 'test10':
    65.                 $this->event_test10('test3');
    66.                 break;
    67.         }
    68.     }
    69.     
    70.     final public function __call($method, $params)
    71.     {
    72.         $this->{'event_'.$method}($params[0]);
    73.     }
    74.     
    75.     final public function run_test4($current)
    76.     {
    77.         $this->$current('test4');
    78.     }
    79.     
    80.     final private function event_test1($param)
    81.     {
    82.     }
    83.     
    84.     final private function event_test2($param)
    85.     {
    86.     }
    87.     
    88.     final private function event_test3($param)
    89.     {
    90.     }
    91.     
    92.     final private function event_test4($param)
    93.     {
    94.     }
    95.     
    96.     final private function event_test5($param)
    97.     {
    98.     }
    99.     
    100.     final private function event_test6($param)
    101.     {
    102.     }
    103.     
    104.     final private function event_test7($param)
    105.     {
    106.     }
    107.     
    108.     final private function event_test8($param)
    109.     {
    110.     }
    111.     
    112.     final private function event_test9($param)
    113.     {
    114.     }
    115.     
    116.     final private function event_test10($param)
    117.     {
    118.     }
    119. }
    120.  
    121. $test = new Test();
    122.  
    123. $time = microtime(true);
    124. for ($i = 0; $i < MAX; ++$i) {
    125.     $test->run_test1('test1');
    126.     $test->run_test1('test2');
    127.     $test->run_test1('test3');
    128.     $test->run_test1('test4');
    129.     $test->run_test1('test5');
    130.     $test->run_test1('test6');
    131.     $test->run_test1('test7');
    132.     $test->run_test1('test8');
    133.     $test->run_test1('test9');
    134.     $test->run_test1('test10');
    135. }
    136. $time2 = microtime(true);
    137. echo 'Test with $this->$k: '.number_format($time2 - $time, 10, '.', '').PHP_EOL.PHP_EOL;
    138.  
    139. $time = microtime(true);
    140. for ($i = 0; $i < MAX; ++$i) {
    141.     $test->run_test2('test1');
    142.     $test->run_test2('test2');
    143.     $test->run_test2('test3');
    144.     $test->run_test2('test4');
    145.     $test->run_test2('test5');
    146.     $test->run_test2('test6');
    147.     $test->run_test2('test7');
    148.     $test->run_test2('test8');
    149.     $test->run_test2('test9');
    150.     $test->run_test2('test10');
    151. }
    152. $time2 = microtime(true);
    153. echo 'Test with call_user_func: '.number_format($time2 - $time, 10, '.', '').PHP_EOL.PHP_EOL;
    154.  
    155. $time = microtime(true);
    156. for ($i = 0; $i < MAX; ++$i) {
    157.     $test->run_test3('test1');
    158.     $test->run_test3('test2');
    159.     $test->run_test3('test3');
    160.     $test->run_test3('test4');
    161.     $test->run_test3('test5');
    162.     $test->run_test3('test6');
    163.     $test->run_test3('test7');
    164.     $test->run_test3('test8');
    165.     $test->run_test3('test9');
    166.     $test->run_test3('test10');
    167. }
    168. $time2 = microtime(true);
    169. echo 'Test with switch: '.number_format($time2 - $time, 10, '.', '').PHP_EOL.PHP_EOL; 
    Результаты:
    Код (Text):
    1. Test with $this->$k:      26.2422990799
    2. Test with call_user_func: 28.9457180500
    3. Test with switch:         62.2703588009
    Тот же тест, только при кол-ве итераций 1
    Код (Text):
    1. Test with $this->$k:      0.0003399849
    2. Test with call_user_func: 0.0009131432
    3. Test with switch:         0.0010728836
     
  11. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    А заявку можно? Меня интересует что работает шустрее:
    mysqli или PDO? Так же интересно как изменится ситуация на php 5.3.0
     
  12. скорее всего, одинаково, т.к. юзают один и тот же драйвер. Разница возможно будет лишь в мелочах. В ПХП 5.3 появился mysqlnd -http://dev.mysql.com/downloads/connector/php-mysqlnd/
     
  13. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    кстати, это и выглядит короче и работает быстрее, а следовательно - меньше влияет на результаты теста :)
    Код (Text):
    1. for ($i = MAX; $i--;) {
     
  14. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    И сразу результаты тестов в качестве доказательства, что обратный цикл втрое быстрее, чем прямой
    Код (Text):
    1. shock@shock:~$ cat direct.php
    Код (PHP):
    1. <?php
    2.  
    3. define('MAX', 100000);
    4. $s = microtime(1);
    5. for ($i = 0; $i < MAX; $i++) { }
    6. $e = microtime(1);
    7. echo $e - $s;
    8.  
    9. ?>
    Код (Text):
    1. shock@shock:~$ cat reverse.php
    Код (PHP):
    1. <?php
    2.  
    3. define('MAX', 100000);
    4. $s = microtime(1);
    5. for ($i = MAX; $i--;) { }
    6. $e = microtime(1);
    7. echo $e - $s;
    8.  
    9. ?>
    Код (Text):
    1. shock@shock:~$ php -f direct.php
    2. 0.0375878810883
    3. shock@shock:~$ php -f direct.php
    4. 0.0357940196991
    5. shock@shock:~$ php -f direct.php
    6. 0.026978969574
    7.  
    8. shock@shock:~$ php -f reverse.php
    9. 0.00968289375305
    10. shock@shock:~$ php -f reverse.php
    11. 0.0103600025177
    12. shock@shock:~$ php -f reverse.php
    13. 0.0092179775238
    Итоговый результат - 0,1 против 0,03
     
  15. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    я слышал про nd, и что вроде бы можно будет пересадить mysqli на него. Поэтому и интересуюсь.
     
  16. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    флоппик
    Koc
    Насчёт скорости - скорее всего да, разницы сильно не будет. Зато я думаю будет достаточно большая разница в потреблении памяти, т.к. PDO это PHP Data Objects, а объекты очень любят память :)

    mysqlnd будет работать с любой либой, которая основана на libmysql, т.е. mysql, mysqli, PDO. Будет жрать в 2 раза меньше памяти и более быстро работать из-за отсуствия необходимости 2 раза копировать данные - один раз в libmysql C, другой раз в PHP.

    Koc
    А что мешает тебе сделать тест самому? На винде это делается как 2 пальца об асфальт.
     
  17. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Psih
    ты подтвердил мои предположения. То есть я ставлю бинарник 5.3.0 и у меня автоматом mysqli работает через nd? А мешает.. Я думаю, что кто-то другой сделает этот тест)
     
  18. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Очередная злая цель: Выяснить что быстрее сохранение/чтение массива в файл serialize или var_export
    А ещё зависит ли скорость от типа массива (числовой или смешанный)

    Код (PHP):
    1.  <?
    2.  include_once "timer.class.php";
    3.  print "<pre>";
    4.  $_GET['process']=!$_GET['process']?"Save":$_GET['process'];
    5.  $_GET['type']=!$_GET['type']?"Serial":$_GET['type'];
    6.  $_GET['array_type']=!$_GET['array_type']?"Numbers":$_GET['array_type'];
    7.   
    8.  function GenArray(){
    9.    $res=false;
    10.    switch($_GET['array_type']){
    11.        case "Words":
    12.            $res=array();
    13.            $s=array("Q"=>0,"W"=>0,"E"=>0,"R"=>0,"T"=>0,"Y"=>0,
    14.                          "U"=>0,"I"=>0,"O"=>0,"P"=>0,"A"=>0,"S"=>0,
    15.                          "D"=>0,"F"=>0,"G"=>0,"H"=>0,"J"=>0,"K"=>0,
    16.                          "L"=>0,"Z"=>0,"X"=>0,"C"=>0,"V"=>0,"B"=>0,
    17.                          "N"=>0,"M"=>0,"1"=>0,"2"=>0,"3"=>0,"4"=>0,
    18.                          "5"=>0,"6"=>0,"7"=>0,"8"=>0,"9"=>0,"0"=>0);
    19.            for($i=0;$i<1000;$i++){
    20.                $res[(implode("",array_rand($s,6)).$i)]=implode("",array_rand($s,20));
    21.            }
    22.        break;
    23.        default;
    24.          $res=range(1,1000);
    25.    }
    26.    return $res;
    27.  }
    28.  function SaveToSerial($i){
    29.      Timer::Run("off");
    30.      $arr=GenArray();
    31.      Timer::Modifer("main","off");
    32.      file_put_contents("data/file_".$i.".data.php",serialize($arr));
    33.  }
    34.  function ReadToSerial($i){
    35.      $fp=file_get_contents("data/file_{$i}.data.php");
    36.      return unserialize($fp);
    37.  }
    38.  
    39.  function SaveToArray($i){
    40.      Timer::Run("off");
    41.      $arr=GenArray();
    42.      Timer::Modifer("main","off");
    43.      file_put_contents("data/file_".$i.".data.php",'<?$data='.var_export($arr,1).'?>');
    44.  }
    45.  function ReadToArray($i){
    46.      include "data/file_{$i}.data.php";
    47.      return $data;
    48.  }
    49.   
    50.  $func=$_GET['process']."To".$_GET['type'];
    51.  if(!function_exists($func)) die("Error, Func does not exists");
    52.  Timer::Run("main");
    53.  for($i=0;$i<1000;$i++){
    54.      $func($i);
    55.  }
    56.   
    57.   
    58. print Timer::End("main",'',"{$_GET['type']} {$_GET['process']} Time (array type - {$_GET['array_type']}): {time}\r\n");
    59.   
    60.  print "</pre>";
    61.  ?>

    Результат: Serialize быстрее по всем показателям, скорость зависит от типа массива, числовой быстрее
    Однако, я всё равно буду использовать var_export, удобнее потому что редактировать
     
  19. Mr.M.I.T., json_* функции тоже замерь. =)
     
  20. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    нет проблем
    Json побыстрее немного...
     
  21. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Может кому пригодится
    Класс - таймер

    Код (PHP):
    1. <?
    2. class Timer {
    3.  protected static $time=array();
    4.  
    5.  /**
    6.    $cnf = array(
    7.       log_autowrite => true/false - автоматически писать в лог
    8.       log_name => Файл в логом
    9.       log_tpl => Дефолтный шаблон записи в лог ({comments} - комментарии {time} - итоговое время)
    10.    )
    11.  */
    12.  public static $cnf=array("log_autowrite"=>1,"log_name"=>"log.txt",
    13. "log_tpl"=>"{comments} Time => {time} \r\n");
    14.  
    15. /**
    16.   Начинает отсчёт времени
    17.   @param string $name - Идентификатор часиков
    18.   @return float;
    19. */
    20.  static function Run($name){
    21.      self::Set($name,self::GetTimeNow());
    22.      return self::Get($name);
    23.  }
    24.  /**
    25.   Возвращает значение часиков
    26.   @param string $name - Идентификатор часиков
    27.   @return float;
    28.  */
    29.  static function Get($name){
    30.      $name=strtolower($name);
    31.      return (float)self::$time[$name];
    32.  }
    33.  /**
    34.   Устанавливает значение часикам
    35.   @param string $name - Идентификатор часиков
    36.   @param float $value - Значение
    37.  */
    38.  static function Set($name,$value){
    39.      $name=strtolower($name);
    40.      self::$time[$name]=(float)$value;
    41.  }
    42.  /**
    43.   Возвращает текущее время в миллисекундах
    44.   @return float;
    45.  */
    46.  static function GetTimeNow(){
    47.      return microtime(1);
    48.  }
    49.  /**
    50.    Заканчиват отсчёт времени, пишет в лог если log_autowrite => true
    51.    @param string $name - идентификатор записи
    52.    @param string $comments - Комментарии
    53.    @param string $log_tpl - Шаблон, если false юзаем дефолтный
    54.    @return string;
    55.  */
    56.  static function End($name,$comments='',$log_tpl=false){
    57.       $time=self::GetTimeNow()-self::Get($name);
    58.       if(!$log_tpl)$log_tpl=self::$cnf['log_tpl'];
    59.       $res=str_replace(array("{comments}","{time}"),array($comments,$time),$log_tpl);
    60.       if(self::$cnf['log_autowrite'])
    61.           self::LogWrite($res);
    62.       return $res;
    63.  }
    64.  /**
    65.    Вносит поправку во время
    66.    @param string $name_modifer - Часики в которые нужно внести поправку
    67.    @param string $name_modificator - Часики с которых поправка будет вноситься
    68.  */
    69.  static function Modifer($name_modifer,$name_modificator){
    70.      self::Set($name_modifer,(self::Get($name_modifer)+(self::GetTimeNow()-self::Get($name_modificator))));
    71.  }
    72.  /**
    73.    Очищает часики
    74.    @param mixed $name - Идентификаторы часиков (string or array)
    75.  */
    76.  static function Clear($name){
    77.      if(!is_array($name)){
    78.        self::Set($name,0);
    79.      }else{
    80.        for($i=0,$c=count($name);$i<$c;$i++)
    81.            self::Clear($name[$i]);
    82.      }
    83.  }
    84.  /**
    85.    Пишет в лог
    86.    @param string $res - текст для записи
    87.    @return string;
    88.  */
    89.  static function LogWrite($res){
    90.      $fp=fopen(self::$cnf['log_name'],'a+');
    91.          fputs($fp,$res);
    92.          fclose($fp);
    93.      return $res;
    94.  }
    95. }
    96.  
    97.  
    98. ?>
    Example
    Код (PHP):
    1. <?
    2. include "timer.class.php";
    3. Timer::Run("main");
    4. $str="fksl;dkfj siojt 4u5903u90856 9sdjgljspdgjdp gp9eu9068opdufglh; kfjfopgh ophkfghif0586";
    5. for($i=0;$i<1000;$i++){
    6.     Timer::Run("time_off");
    7.     for($l=0;$l<1000;$l++){
    8.         preg_match("#[^a-zA-Z]+#isU",$str);
    9.     }
    10.     Timer::Modifer("main","time_off");
    11. }
    12.  
    13. print Timer::End("main","Main Off");
    14. ?>
     
  22. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    microtime(1);

    $cnf - это $cfg ?

    И тут намного лучше был бы нестатический класс.
    Код (PHP):
    1. <?
    2. $timer1 = new Timer;
    3. $timer2 = new Timer;
    4.  
    5. $timer1->start();
    6. action1();
    7. $timer2->start();
    8. action3();
    9. $timer1->stop();
    10. action5();
    11. $timer2->stop(); 
    Хотя у самого есть такой класс, придерживаюсь политики, что он не нужен, ибо значительно влияет на время эксперимента
     
  23. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    пусть гора идёт к магамеду
    это переменная cnf
    Чем? он хуже всем, хотя бы потому что не глобальный
    затестил, на 0.0044 дольше
    только на выводы при сравнении это не влияет
     
  24. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    что быстрее in_array или array_search, зависит ли скорость от типа ключей (текстовый или числовой)
    Код (PHP):
    1. <?
    2. include_once "timer.class.php";
    3.  
    4. $_GET['func']=!$_GET['func']?"in_array":$_GET['func'];
    5. $_GET['type']=!$_GET['type']?"Numbers":$_GET['type'];
    6.  
    7. if(!in_array(strtolower($_GET['func']),array("in_array","array_search"))) die("Func not found");
    8.  
    9. function GenArray(){
    10.    $res=array();
    11.    $s=array("Q"=>0,"W"=>0,"E"=>0,"R"=>0,"T"=>0,"Y"=>0,
    12.                  "U"=>0,"I"=>0,"O"=>0,"P"=>0,"A"=>0,"S"=>0,"D"=>0,
    13.                  "F"=>0,"G"=>0,"H"=>0,"J"=>0,"K"=>0,"L"=>0,"Z"=>0,"X"=>0,
    14.                  "C"=>0,"V"=>0,"B"=>0,"N"=>0,"M"=>0,"1"=>0,"2"=>0,"3"=>0,
    15.                  "4"=>0,"5"=>0,"6"=>0,"7"=>0,"8"=>0,"9"=>0,"0"=>0);
    16.    switch($_GET['type']){
    17.        case "Words":
    18.           for($i=0;$i<5000;$i++)
    19.               $res[(implode('',array_rand($s,5)).$i)]="ABC_$i";
    20.        break;
    21.        default;
    22.          $_GET['type']="Numbers";
    23.           for($i=0;$i<5000;$i++)
    24.                $res[$i]="ABC_$i";
    25.    }
    26.    return $res;
    27.  }
    28.  
    29.  
    30.  
    31. print "<pre>";
    32.  
    33. $arr=GenArray();
    34.  
    35. Timer::Run("main");
    36. for($i=0;$i<5000;$i++){
    37.     call_user_func($_GET['func'],"ABC_$i",$arr);
    38. }
    39.  
    40. print Timer::End("main",'',"Array type:{$_GET['type']}; Function: {$_GET['func']}, Итоговое Время => {time}\r\n");
    41. print "</pre>";
    42. ?>

    array_search быстрее, но при повторном обновлении страницы тормозится...почему-то
    С чисвловыми ключами обе работают немного быстрее
     
  25. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Mr.M.I.T.
    извини, но код ужастен и малопонятен.

    Это разве хороший стиль?
    Код (PHP):
    1. <? $s = array_fill_keys(array_merge(range('A', 'Z'), range('0', '9')), 0); 
    Зачем эти все проверки, зачем влияющая на статистику call_user_func($_GET['func'], вместо нормального вызова функции.

    Каша какая то. Непонятно, что какая строка делает.