За последние 24 часа нас посетили 21940 программистов и 1004 робота. Сейчас ищут 703 программиста ...

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

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

  1. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Объявление функций в подключаемых файлах.
    Функции объявляются очень быстро, поэтому для получение адекватных результатов, надо тестировать на очень большом количестве функций.
    Генератор PHP-файла с 1 млн. функций с разным количеством аргументов:
    Код (PHP):
    1. $str = '<?php';
    2. for ($i = 0; $i < 1000000; $i++) {
    3.     $str .= ' function ' . uniqid('fn') . '(';
    4.     $str .= '$arg' . implode(',$arg', range(rand(0, 1), rand(1, 5))) . ')';
    5.     $str .= ' { return true; }';
    6. }
    7. file_put_contents('1mlnfncs.php', $str); 
    Получаем файл, объемом ~62Мб.
    Cкрипт для тестирования:
    Код (PHP):
    1. ini_set('memory_limit','2560M');
    2. $start = microtime(1);
    3. include('1mlnfncs.php');
    4. echo microtime(1) - $start; 
    На среднем серваке получаем 5.8768661022186.

    Если закомментировать все функции сразу /* */, то include такого файла займет около 0,2 сек. Таким образом, объявление миллиона функций занимает чуть более 5,5 сек.
     
  2. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    часто ли вы применяете SplFixedArray ?
     
  3. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    in_array() vs. array_key_exists() vs. isset()

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

    Проверка in_array():
    Код (PHP):
    1. $arr = [];
    2. for ($i = 0; $i < 500000; $i++) {
    3. $arr[] = $i;
    4. }
    5.  
    6. $t = microtime(1);
    7.  
    8. for ($i = 0; $i < 100; $i++) {
    9. in_array(rand(999999, 9999999), $arr);
    10. }
    11.  
    12. echo round(microtime(1) - $t, 3); // 1.276 
    Всего 100 проверок отнимают больше секунды. Это эквивалентно миллиону проверок ключей:
    Код (PHP):
    1. $arr = [];
    2. for ($i = 0; $i < 500000; $i++) {
    3. $arr[$i] = 1;
    4. }
    5.  
    6. $t = microtime(1);
    7.  
    8. for ($i = 0; $i < 1000000; $i++) {
    9. array_key_exists(rand(999999, 9999999), $arr);
    10. }
    11.  
    12. echo round(microtime(1) - $t, 3); // 1.197 
    isset() работает до 2 раз быстрее:
    Код (PHP):
    1. $arr = [];
    2. for ($i = 0; $i < 500000; $i++) {
    3. $arr[$i] = 1;
    4. }
    5.  
    6. $t = microtime(1);
    7.  
    8. for ($i = 0; $i < 1000000; $i++) {
    9. isset($arr[rand(999999, 9999999)]);
    10. }
    11.  
    12. echo round(microtime(1) - $t, 3); // 0.588 
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Добавление: разница должна быть заметна только на реально больших массивах. А объясняется это тем, что массив в PHP устроен как хеш-таблица — то есть оптимизирован для быстрого нахождения ключа в большом наборе.
    in_array() же тупо перебирает все элементы, пока не найдет совпадение.

    http://habrahabr.ru/post/162685/
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    PHP:
    1. <?php
    2.  
    3. $array = range ( 0, 999999 );
    4.  
    5. $array = array_flip ( $array );
    6.  
    7. $a = microtime(1);
    8.  
    9. $i = 10000000;
    10.  
    11. while ( $i-- )
    12. {
    13.     //if ( in_array ( 999919, $array ) ) // failed
    14.     //if ( array_key_exists ( 999919, $array) ) // 0.17
    15.     if ( isset ( $array[999919] ) ) // 0.15
    16.     {
    17.         1;
    18.     }
    19. }
    20.  
    21. printf ( '%.2f', microtime(1)-$a );
    PHP 7.4.7
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    PHP 7.4.7

    Мин время выполнения (иногда). Две функции работают одинаково по скорости.

    PHP:
    1. <?php
    2.  
    3. $array = [ 1=>null,2=>null ];
    4. $i = 50000000;
    5.  
    6. $a = microtime (1);
    7.  
    8. while ( $i-- )
    9. {
    10.     $b = array_key_first ( $array ); // 1.39
    11. }
    12. printf ( '%.2f' . PHP_EOL, microtime (1) - $a );
    13.  
    14. $i = 50000000;
    15.  
    16. $a = microtime (1);
    17. while ( $i-- )
    18. {
    19.     $b = key ( $array ); // 1.34
    20. }
    21. printf ( '%.2f', microtime (1) - $a );
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    проверить или забить ?

    PHP:
    1. <?php
    2.  
    3. $arr = [ 4 => 1, 8 => 1, 20 => 1 ];
    4.  
    5. $i = 100000000;
    6.  
    7. $a = microtime (1);
    8.  
    9. while ( $i-- )
    10. {
    11.     // isset ( $arr[8] ); // 2.23
    12.     // if ( ! isset ( $arr[8] ) ) // 2.50
    13.     $arr[8] = 1; // 1.73
    14. }
    15.  
    16. printf ( '%.2f', microtime (1) - $a );
    PHP 7.4.7
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    PHP 7.4.7
    PHP:
    1. <?php
    2.  
    3. $i = 1000000;
    4.  
    5. $a = microtime ( true );
    6.  
    7. while ( $i-- )
    8. {
    9.     strtr ( 'gg!!.g.!,.g,,', [ '!' => null, '.' => null, ',' => null ] );
    10. }
    11.  
    12. printf ( '%.3f' . PHP_EOL, microtime ( true ) - $a );
    13.  
    14. $i = 1000000;
    15.  
    16. $a = microtime ( true );
    17.  
    18. while ( $i-- )
    19. {
    20.     str_replace ( '!.,', '', 'gg!!.g.!,.g,,' );
    21. }
    22.  
    23. printf ( '%.3f' . PHP_EOL, microtime ( true ) - $a );
    0.387 strtr
    0.068

    НО!

    PHP:
    1. <?php
    2.  
    3. $a = '122333';
    4.  
    5. $arr = [
    6.     '1' => 'a',
    7.     '2' => 'b',
    8.     '3' => 'c',
    9.     '333' => 'd',
    10.     '22' => 'e',
    11.     '33' => 'f',
    12. ];
    13.  
    14. echo strtr ( $a, $arr ) . PHP_EOL;
    15.  
    16. echo str_replace ( array_keys ( $arr ), array_values ( $arr ), $a );
    aed
    abbccc
     
    #208 MouseZver, 1 авг 2020
    Последнее редактирование: 1 авг 2020
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    PHP 7.4.7

    что быстрее - с указанным диапазоном или внутренним ?

    PHP:
    1. <?php
    2.  
    3. $i = 1000000;
    4.  
    5. $a = microtime ( true );
    6. while ( $i-- )
    7. {
    8.     mt_rand ();
    9. }
    10. printf ( '%.3f' . PHP_EOL, microtime ( true ) - $a );
    11.  
    12. $i = 1000000;
    13.  
    14. $a = microtime ( true );
    15. while ( $i-- )
    16. {
    17.     mt_rand ( 1000000, 9999999 );
    18. }
    19. printf ( '%.3f' . PHP_EOL, microtime ( true ) - $a );
    20.  
    21. $i = 1000000;
    22.  
    23. $a = microtime ( true );
    24. while ( $i-- )
    25. {
    26.     mt_rand ( 1000, 9999 );
    27. }
    28. printf ( '%.3f' . PHP_EOL, microtime ( true ) - $a );
    0.022
    0.043
    0.043