1. PHP / Говнокод #17413

    +155

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    <?php
    
    function load ($file) {
    	static $files = null;
    	$files or $files = [];
    	
    	if (!isset($files[$file])) {
    		require($file);
    		$files[$file] = true;
    	}
    }
    
    $times = 1000000;
    $time1 = microtime(true);
    
    for ($i = 0; $i < $times; $i ++) {
    	require_once('inc.php');
    }
    
    $end1 = microtime(true) - $time1;
    
    $time2 = microtime(true);
    
    for ($i = 0; $i < $times; $i ++) {
    	load('inc.php');
    }
    
    $end2 = microtime(true) - $time2;
    
    echo "require_once = $end1 vs \nload = $end2";

    Вот это да... require_once работает в ~8 раз медленнее чем функция load. Вывод:
    require_once = 16.962311029434 vs
    load = 2.6861710548401

    Содежания файла inc.php:

    <?php echo 'Hello, world!';

    Запостил: volter9, 06 Января 2015

    Комментарии (38) RSS

    • ~ $ php ./test.php 
      Hello, worldHello, worldrequire_once = 3.3041141033173 vs 
      load = 4.1988770961761
      ~ $ php -v
      PHP 5.5.20-pl0-gentoo (cli) (built: Dec 22 2014 23:22:44) 
      Copyright (c) 1997-2014 The PHP Group
      Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
          with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies
          with Xdebug v2.2.3, Copyright (c) 2002-2013, by Derick Rethans

      Щито я делаю не так?
      Ответить
      • имеешь свежую версию PHP, где чуваки уже схватились за голову.
        Ответить
        • я уж молчу о том, что я уверен, что костыль не реализует в полной мере require_once, там даже return нет.
          Ответить
          • > return
            А что возвращает require_once? Результат, который вернул модуль при его первой и единственой загрузке?
            Ответить
            • забавная штука, в первый раз он возвращает нормальное значение (ну как нормальное, файл с классом вернет 1), в остальное время - bool.

              upd: @require_once('nonexistent') вернет вообще ебаное ничего, лол. вар_дамп отказывается это выводить.
              Ответить
              • > вар_дамп отказывается это выводить
                Оно ничего не возвращает, это ж фатальная ошибка. До var_dump дело не доходит:

                require is identical to include except upon failure it will also produce a fatal E_COMPILE_ERROR level error. In other words, it will halt the script whereas include only emits a warning (E_WARNING) which allows the script to continue.
                Ответить
                • P.S. Забавно, что @ убирает логирование не только ворнингов, но и ошибок... Скрипт всё равно валится, но уже без шансов найти место, где произошла ошибка.

                  Шах и мат, собакоёбы.
                  Ответить
                  • да я бы вообще ее к хуям запретил
                    Ответить
                    • Проще пых запретить, чем все его "полезные" и так любимые народом говнофичи :)

                      Тут вон были личности, которые волшебные кавычки яростно защищали...
                      Ответить
                      • Не, там на удивление хорошо все может быть написано, если пишут толковые чуваки. Убрать бы только всю старую систему ворнингов и всю функциональщину сдублировать в ОО-подходе - было бы очень ок.
                        Ждем седьмой версии и phpng короче.
                        Ответить
                        • тщетно
                          врач сказал - в морг, значит, в морг
                          Ответить
                        • > Не, там на удивление хорошо все может быть написано, если пишут толковые чуваки.
                          Чтобы пройти минное поле нужен хороший проводник :)
                          Ответить
            • В пыхе работает и такая конструкция:
              // inc.php
              <?php
              return 'anything you want';
              // end of inc.php
              
              echo require_once 'inc.php'; // string "anything you want"
              Ответить
              • Но... Ведь return завершит работу скрипта до require_once, и код ничего не выведет?
                Ответить
                • Тут два файла описаны. Первый действительно оборвется на return.
                  Ответить
                  • А, а я подумал, что файл сам себя загружает ;) Не заметил //end of inc.php.
                    Ответить
    • Очередная спичкооптимизация?
      Ответить
      • Нет, просто автора смутило, что нативная конструкция работает медленнее, чем костыль её эмулирующий. KO
        Ответить
    • пользуясь случаем, пропиарю атлетик https://packagist.org/packages/athletic/athletic
      Ответить
    • Hello, world!Hello, world!require_once = 3.1194000244141 vs
      load = 25.989000082016

      Вывод php -v:
      PHP 5.3.29 (cli) (built: Aug 15 2014 19:17:16) 
      Copyright (c) 1997-2014 The PHP Group
      Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies
          with Xdebug v2.1.1, Copyright (c) 2002-2011, by Derick Rethans

      Да, [] заменил на array().
      Ответить
      • P.S. Весь зоопарк:
        \       | require_once    | load
        --------+-----------------+-----------------
        php 6.0 | 253.78484082222 | 1.7592749595642
        --------+-----------------+-----------------
        php 5.2 | 94.472290039062 | 1.8203229904175
        --------+-----------------+-----------------
        php 5.3 | 3.1668000221252 | 26.75720000267
        --------+-----------------+-----------------
        php 5.4 | 4.3517999649048 | 29.862200021744
        --------+-----------------+-----------------
        php 5.5 | 2.8236000537872 | 24.242399930954
        --------+-----------------+-----------------
        php 5.6 | 2.199599981308  | 0.77999997138977
        --------+-----------------+-----------------
        php 5.7 | 2.1059999465942 | 0.7020001411438
        --------+-----------------+-----------------
        php 7.0 | 1.9967999458313 | 0.42120003700256
        Ответить
        • А чего в 6.0 так медленно? Может быть какой-то лаг во время теста был? Или воспроизводится каждый раз?
          Ответить
          • 6.0 - умершая ветка, где хотели использовать utf-16, но тщетно было бытие. Следующий релиз - 7.0, а 6.0 никогда не будет.
            Ответить
          • Для тех кто следит за качеством ПХП тут есть интересная информация: http://gcov.php.net/viewer.php?version=PHP_5_6
            Ответить
          • Отладочная версия же. Мне вообще повезло, что я нашёл этот труп. А теперь пора уже закопать стюардессу.
            Ответить
        • Сделать себе таблицу, и в зависимости от версии вызывать то или другое.
          Ответить
          • Чисто гипотетически скорость может зависеть от настроек интерпретатора и от списка загруженных расширений. Требуется дополнительное исследование.
            Ответить
            • P.S. Подтверждается. В голом php 5.4 без расширений:
              require_once = 2.6988000869751 vs load = 0.74880003929138
              В том же php 5.4 + xdebug:
              require_once = 3.0107998847961 vs load = 24.398400068283
              Ответить
              • У меня тоже стоит XDebug, но настроен только remote
                Ответить
        • Как Вы это сделали? В смысле, ручками что ли каждый PHP проверяли, или есть какой том менеджер PHP типа rvm в Ruby?
          Ответить
          • В batch-скрипте указал явно путь к каждому интерпретатору. Только консолечка, ну Вы поняли.

            А вообще никто не мешает запустить одновременно несколько FastCGI-серверов на разных портах и использовать в вебе одновременно несколько пыхов.
            Ответить
    • Продолжайте в том же духе. Ваш сайт тормозит именно по причине инклудов.
      Ответить
      • Да, некоторые сайты тормозят именно по причине инклудов. Помню, на одном сайте (типа форума) в одной теме было больше 3к комментариев, причём шаблон каждого комментария подключался инклудом. После переноса содержимого шаблона непосредственно в тело цикла лаг заметно уменьшился.
        Ответить
        • говно архитектура же. нет бы раз забрать шаблон из файлика и втыкать в него данные в цикле. ИМХО пых тут не виноват.
          Ответить
          • Ну нет же. MVC же. Обвешаемся паттернами, а все глюки - по причине недоязыка.
            Ответить
            • Дада , мвц виноват! Мвц это инкулды же. Питухи не используют мвц
              Ответить

    Добавить комментарий