2013-06-20 4 views
2

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

// Plain variable assignment. 
    $time = microtime(true); 
    $i = 100000; 
    while ($i--) 
    { 
     $x = 'a'; 
    } 
    echo microtime(true) - $time."\n\n"; 
// 0.017973899841309 

    $time = microtime(true); 
    function f() { $a = "a"; return $a; } 
    $i = 100000; 
    while ($i--) 
    { 
     $x = f(); 
    } 
    echo microtime(true) - $time."\n\n"; 
//0.18558096885681 

Кстати анонимные функции являются наихудшими. твой в 10 раз медленнее.

Есть ли PHP-Script-Optimizer, который уменьшает количество вызовов функций и минимизирует сценарий?

Существует также этот пост: Why are PHP function calls *so* expensive?, связанные с этой статьей

+1

Вы сравниваете немного несправедливо, потому что ваш случай вызова функции выполняет больше работы, чем просто добавляет вызов функции. Тело функции должно быть $ x = 'a'; вернуть; вызов функции должен быть просто f(); и ваш запуск запуска microtime должен произойти после объявления функции, а не раньше. Но согласился, PHP довольно медленно при вызове функций. На самом деле, это довольно медленно во многих вещах, из-за его реализации. Зачем выбирать вызовы функций? –

+0

Я проверил ваш точный код с включенным APC, и он только в 2,5 раза медленнее использовал вызовы функций. – Pitchinnate

+0

Все, о чем вы говорите, называется ** Преждевременная оптимизация ** – Yang

ответ

0

Вы только действительно вызывать функции, которые вам нужны в данный момент времени, поэтому нет.

Вещь, которую Вы могли бы сделать, чтобы оптимизировать свой код используется в качестве минимальных анонимные функции, уменьшая количество пробелов (например, использовать PHP Minifier) ​​и переименовывать функции имен 1 буквенных,

это было бы по крайней мере разметить ваш скрипт, который позволит быстрее считывать функции. Но с точки зрения оптимализации вам лучше не делать этого из-за того, что читаемость полностью исчезла из-за утечки.