<rmcreative>

RSS

Скорость eval и анонимных функций

11 февраля 2012

Всё ещё используете eval там, где его можно не использовать? Вот ещё одна причина посмотреть в сторону PHP 5.3 и анонимных функций:

$count = 50;
$start = microtime(true);
$y = 0;
for($i = 0; $i < $count; $i++)
{
    eval('++$y;');
}
 
printf("#1, result is %d, done in %f\n", $y, microtime(true) - $start);
 
$start = microtime(true);
$y = 0;
for($i = 0; $i < $count; $i++)
{
    $f = function() use (&$y)
    {
        return ++$y;
    };
    $f();
}
 
printf("#2, result is %d, done in %f\n", $y, microtime(true) - $start);

На выходе получаем:

d:\src>php callback_performance.php
#1, result is 50, done in 0.000415
#2, result is 50, done in 0.000270
 
d:\src>php callback_performance.php
#1, result is 50, done in 0.000413
#2, result is 50, done in 0.000261
 
d:\src>php callback_performance.php
#1, result is 50, done in 0.000412
#2, result is 50, done in 0.000273

Кроме того, что анонимные функции удобней, они ещё и быстрее.

Комментарии RSS

  1. №5871
    Kirill
    Kirill 11.02.2012, 21:19:30

    Ждем использования анонимных функций в Yii 2 :) Ведь в 1.1.x eval используется много где, верно?

  2. №5872
    Максим
    Максим 11.02.2012, 21:51:10

    Optimizer стоит ? 2Kirill, В yii 1.1 можно анонимные функции использовать.

  3. №5873
    Sam
    Sam 11.02.2012, 23:22:47

    Максим, да. Запусти у себя попробуй.

  4. №5874
    Алексей
    Алексей 12.02.2012, 12:13:58

    Денвер, оптимайзера не стоит

    #1, result is 50, done in 0.001122 
    #2, result is 50, done in 0.000702
    
  5. №5875
    Bettrrr
    Bettrrr 12.02.2012, 15:08:47

    Какое отношение анонимные функции имеют к Eval?

  6. №5878
    Sam
    Sam 13.02.2012, 2:43:31

    Bettrrr, и то и то используют для callback-ов. Например, в гридах Yii.

  7. №5900
    vasa_c
    vasa_c 14.02.2012, 15:24:38

    При всей своей нелюбви к eval'у не могу не позанудствовать. Код в eval() транслируется в момент вызова, а у анонимной функции в момент подключения файла (если без акселераторов). Так что при одиночном вызове кто быстрее неизвестно :)

  8. №5943
    Stepan
    Stepan 21.02.2012, 19:20:38

    Я так понимаю если хочеться совместимости с php 5.2 то про анонимные функции можно забыть?

  9. №5944
    Sam
    Sam 21.02.2012, 21:29:14

    Естественно.

  10. №6046
    Meccup
    Meccup 13.03.2012, 14:35:31

    Причем тут тег "CGridView" у поста?

  11. №6049
    Sam
    Sam 13.03.2012, 22:59:28

    Meccup, это можно использовать в CGridView.

  12. №8189
    fox
    fox 24.07.2013, 12:24:11

    Сразу скажу что я новичок. Я не понимаю как здесь анонимная функция заменяет eval. eval() вычисляет строку, заданную в code_str, как код PHP. Что у Вас и сделано. А в анонимной функции вы работаете не со строкой. Тогда в чем соль? Поставьте мой мозг на истинный путь)

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.