2011-01-24 3 views
10

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 for php

+10

Вопрос, который вы должны задать себе: есть ли разница в скорости, вызывающая у вас какие-либо проблемы? Если нет, не беспокойтесь об этом. –

+1

не знаю .. но если статические методы легко вызвать, и я использую его много. У меня было предположение, что статический метод будет медленным, чем обычный, но мои результаты показывают статичность быстрее. просто хотел подтвердить (для знания допустим) –

+2

Завершить это. Сначала заставьте его работать. Из вашего простого теста довольно ясно, что это, вероятно, не значительная разница в величине разницы, поэтому сосредоточьтесь на функциях и волнуйтесь о оптимизации на миллисекундах, если она станет популярной. Тем не менее, к тому времени, когда вы доберетесь до этого уровня, вы, вероятно, заново произвели все это за несколько раз ... – Hamy

ответ

31

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

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

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++; 
    } 
} 

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

+2

Хотя это правильный ответ учебника, [статические методы являются смертельными для проверки] (http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability), и их следует избегать , – Gordon

+0

Вы уверены, что звук логичен, но +1 проголосовать до принятия завтра –

17

Короткий ответ, так как я не хочу идти на громкие слова, чтобы много:

Это не имеет значения, если это быстрее. Если вам нужно что-то, где производительность - это то, что вы думаете о бритье 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

Premature optimization is the root of all evil. Построить код, который легко поддерживать, и если она становится медленно взять профиль и это, скорее всего, скажет вам, что файловая система или база данных является проблемой, у вас есть все, что отсортировано, там будут некоторые очень конкретные части php для оптимизации. Если вы получите чистый, сменный код, вы можете ускорить его.

+0

Я думаю, что Стефан, должно быть, снял свой слайд-шоу, но похоже, что кто-то еще поставил здесь копию, кажется, действительно хороший читать ... http: // www. scribd.com/doc/20893084/Advanced-OOP-and-Design-Patterns – Carlton

+0

«Статические методы делают для неустойчивого, неподъемного,« глобального всего »кода, который причинит вам боль намного больше, чем что-либо другое». Я не согласен полностью. Его даже проще проверить статический метод, чем нестатический. Класс: метод() проще, чем $ obj = new Class(); $ Obj->() метод. – magallanes

0

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

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

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

3

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

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

Смежные вопросы