Статический метод быстрее, чем нестатический?

EDIT:: о, я забыл

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 

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

Ответ 1

Вы всегда должны использовать 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++;
    }
}

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

Ответ 2

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

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

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

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

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

http://sebastian-bergmann.de/archives/885-Stubbing-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 для оптимизации. Если у вас есть чистый, сменный код, вы можете ускорить его.

Ответ 3

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

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

Ответ 5

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

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

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