2010-08-17 2 views
2

Вызывает ли большее количество функций какой-либо заметный эффект производительности или пытается сократить количество вызовов функций бессмысленной преждевременной оптимизации?сколько эффекта имеет количество вызовов функций на производительность?

Упрощенный пример: Есть ли реальный пример производительности между этим:

function foo($var) { 
    echo $var; 
} 
foo(); 

И Это:

function foo($var) { 
    bar($var); 
} 

function bar($var) { 
    baz($var); 
} 

function baz($var) { 
    echo $var; 
} 

foo(); 

ответ

7

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

Для более прямого ответа на ваш вопрос, влияние на производительность зависит от довольно много вещей:

  1. Как часто функция называется?
  2. Действительно ли это в критическом разделе кода?
  3. Насколько велика функция/-функция?

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

6

Всегда делать профилирование, а затем возиться с оптимизацией.

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

1

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

Но помните, что наибольший прирост производительности - переход от нерабочего состояния к рабочему. Только после этого начните заниматься актуальными узкими местами ... И никогда не забывайте: Premature optimization is the root of all evil ...

1

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

3

Чтобы ответить на ваш вопрос простейшим способом п

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

Чтобы проиллюстрировать мою мысль. Компьютеры работают в наносекундные таймфреймы. Люди могут обнаружить около 10 миллисекунд (от тестирования пользовательского интерфейса). 1 мс = 1,0 × 10 6 нс.Поэтому, если вам требуется 1ns для вызова вашей функции, вам нужно будет называть ее от 1 миллиона до 10 миллионов раз, прежде чем человек сможет отличить ее.

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

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

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