Статическая и динамическая классовая функция (метод) - что быстрее? - PullRequest
0 голосов
/ 10 февраля 2012

Кто-нибудь сделал надлежащий тест на разницу в производительности между этими тремя функциями foo?

function foo_global() {
}

class SomeClass {
  public function foo_dynamic() {
  }

  public static function foo_static() {
  }
}

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

Спасибо

1 Ответ

4 голосов
/ 10 февраля 2012

В моих тестах разницы практически нет:

Function call benchmark

Таким образом, статические вызовы немного медленнее динамических, а динамические - немного медленнее глобальных функций.

<?php
function pre_defined($v1, $v2) {
    return $v1 + $v2;
}
$anonymous = function($v1, $v2) {
    return $v1 + $v2;
};
$create_function = create_function('$v1, $v2', 'return $v1 + $v2;');

class StaticFunction {
    public static function test($v1, $v2) {
        return $v1 + $v2;
    }
}

class DynamicFunction {
    public function test($v1, $v2) {
        return $v1 + $v2;
    }
}
$dynamic = new DynamicFunction();

$v1 = 1;
$v2 = 2;
$iterations = 1000;
Performance\BenchmarkManager::add_group('Function call', new Performance\BenchmarkGroup(array(
    'benchmarks' => array(
        'empty loop' => function() use($iterations, $v1, $v2) {
            for ($i = 0; $i < $iterations; $i++) {
            }
        },
        'native reference point' => function() use($iterations, $v1, $v2) {
            for ($i = 0; $i < $iterations; $i++) {
                $result = $v1 + $v2;
            }
        },
        'pre defined' => function() use($iterations, $v1, $v2) {
            for ($i = 0; $i < $iterations; $i++) {
                $result = pre_defined($v1, $v2);
            }
        },
        'anonymous' => function() use($iterations, $v1, $v2, $anonymous) {
            for ($i = 0; $i < $iterations; $i++) {
                $anonymous($v1, $v2);
            }
        },
        'create_function' => function() use($iterations, $v1, $v2, $create_function) {
            for ($i = 0; $i < $iterations; $i++) {
                $create_function($v1, $v2);
            }
        },
        'eval' => function() use($iterations, $v1, $v2) {
            for ($i = 0; $i < $iterations; $i++) {
                eval('$result = $v1 + $v2;');
            }
        },
        'static' => function() use($iterations, $v1, $v2) {
            for ($i = 0; $i < $iterations; $i++) {
                StaticFunction::test($v1, $v2);
            }
        },
        'dynamic' => function() use($iterations, $v1, $v2, $dynamic) {
            for ($i = 0; $i < $iterations; $i++) {
                $dynamic->test($v1, $v2);
            }
        },
    ),
)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...