Является ли статический метод быстрее, чем нестатический? - PullRequest
12 голосов
/ 24 января 2011

РЕДАКТИРОВАТЬ :: о, я забыл

class Test1{
    public static function test(){
        for($i=0; $i<=1000; $i++)
            $j += $i;       
    }   
}

class Test2{
    public function test() {
        for ($i=0; $i<=1000; $i++){
            $j += $i;
        }
    }

}

для этого алгоритма

$time_start = microtime();
$test1 = new Test2();
for($i=0; $i<=100;$i++)
    $test1->test();
$time_end = microtime();

$time1 = $time_end - $time_start;

$time_start = microtime();
for($i=0; $i<=100;$i++)
    Test1::test();
$time_end = microtime();    

$time2 = $time_end - $time_start;
$time = $time1 - $time2;
echo "Difference: $time";

у меня есть результаты

Difference: 0.007561 

и в эти дни я пытаюсьсделайте мои методы статичными, насколько это возможно.Но правда ли это, по крайней мере, для php

Ответы [ 5 ]

35 голосов
/ 24 января 2011

Вы всегда должны использовать static, когда вам не нужен объект вокруг вашего метода, и использовать динамический, когда вам нужен объект. В приведенном вами примере вам не нужен объект, потому что метод не взаимодействует ни с какими свойствами или полями в вашем классе.

Этот должен быть статическим, потому что ему не нужен объект:

class Person {
    public static function GetPersonByID($id) {
        //run SQL query here
        $res = new Person();
        $res->name = $sql["name"];
        //fill in the object
        return $res;
    }
}

Этот должен быть динамическим, потому что он использует объект, в котором он находится:

class Person {
    public $Name;
    public $Age;
    public function HaveBirthday() {
        $Age++;
    }
}

Разница в скорости минимальна, но вы должны создать объект для запуска динамических методов, и этот объект будет сохранен в памяти, поэтому динамические методы используют больше памяти и немного больше времени.

18 голосов
/ 24 января 2011

Краткий ответ, так как я не хочу много наговаривать:

Неважно, быстрее ли это. Если вам нужно что-то, где производительность очень важна, вы подумаете об уменьшении 0,02 наносекунды на вызов функции, чем все равно не будете делать это в PHP.

Статические методы создают непроверяемый, не поддерживаемый код «все», который причинит вам боль больше, чем что-либо еще.

Если вы не хотите использовать надлежащий ООП (и это прекрасно, если вы знаете, что и зачем вы это делаете), тогда, пожалуйста, сделайте это. Только не делайте этого, потому что вы хотите сэкономить время процессора.

http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/

http://sebastian -bergmann.de / архив / 885-заглушек-Hard-Coded-Dependencies.html

http://en.wikipedia.org/wiki/Class-based_programming

Если вы нажмете только одну ссылку: http://www.scribd.com/doc/20893084/Advanced-OOP-and-Design-Patterns#scribd

Преждевременная оптимизация - корень зла проблема с базой данных, если у вас есть все, что нужно разобрать, будут некоторые очень специфичные части php для оптимизации. Если вы получили чистый, изменяемый код, вы можете ускорить его.

4 голосов
/ 09 апреля 2014

«Преждевременная оптимизация - корень всего зла», - сказал 40 лет назад Дональд Кнут.Вы знаете, когда у вас был новый микропроцессор 4004 , который изобрел Intel.Этот барабан бьет так сильно, как может быть любая лошадь, и я не понимаю, как он соотносится с первоначальным вопросом.На самом деле, возможно, мне повезло, но я не видел доказательств такого безудержного поведения в поле.Увы, кто-то в Интернете должен быть прав, прежде чем мы сможем уложить все на ночь.

Больше по теме, я думаю, что принятый ответ является наиболее прагматичным, и первый комментарий к вопросу является правильным, чтобы спросить.Быстрее статический или инстанцированный код в большей степени зависит от того, как реализован язык, и я не вижу, чтобы какой-либо из этих ответов в достаточной степени отвечал на вопрос относительно PHP.Кто-нибудь знает PHP и хочет взвесить?

1 голос
/ 07 мая 2014

Вообще-то да.Статические методы и свойства работают быстрее (кроме PHP 5.3).

Вы можете обратиться к этому более или менее подробному сравнению статических и нестатических методов в PHP .

0 голосов
/ 17 февраля 2014

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

Я вполне уверен, что производительность с динамическими методами выше, поскольку вызовы выполняются в одном и том же объекте.При использовании статических методов в объектах для каждого вызова требуется дополнительный переход, поскольку вызов выполняется не внутри объекта, а в классе.

Это уменьшает использование памяти для использования статических методов.Если вы сможете разместить свои методы в классе, без них объекты будут легче.Но самое главное в моих тестах - доступность.Прямой доступ к методам является самым быстрым, в то время как доступ к методам статического класса - это дополнительный прыжок.Это действительно вопрос обработки в сравнении с памятью.В девяти случаях из десяти динамика быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...