Статический метод быстрее, чем нестатический?
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 и хочет взвесить?
Ответ 4
Как правило, да. Статические методы и свойства работают быстрее (за исключением PHP 5.3).
Вы можете ссылаться на это более или менее подробное сравнение статических и нестатических методов в PHP.
Ответ 5
Если вы намереваетесь сделать свои методы статическими и добавить параметр для передачи объектов класса в, что на самом деле медленнее. Я сравнил тест с этим, и это значительная потеря. Прохождение объектов через различные статические методы - это потеря производительности. Лучше держать их динамическими в объекте.
Я достаточно уверен, что динамические методы работают быстрее, потому что вызовы выполняются в одном и том же объекте. При использовании статических методов в объектах существует дополнительный прыжок для каждого вызова, поскольку вызов не выполняется внутри объекта, но в классе.
Это уменьшает использование памяти для использования статических методов. Если вы можете разместить свои методы в классе, объекты без них будут легче. Но самое главное в моих тестах - доступность. Прямой доступ к методам является самым быстрым, в то время как доступ к статическим методам класса - дополнительный прыжок. Это действительно вопрос обработки в сравнении с памятью. Девять раз из десяти, динамика быстрее.