Я относительно новичок в PHP и медленно изучаю особенности, характерные для языка. Одна вещь, которую я получаю от многих, - это то, что я (так мне сказали) использует слишком много вызовов функций, и обычно меня просят сделать что-то для их работы. Здесь два примера:
// Change this:
} catch (Exception $e) {
print "It seems that error " . $e->getCode() . " occured";
log("Error: " . $e->getCode());
}
// To this:
} catch (Exception $e) {
$code = $e->getCode();
print "It seems that error " . $code . " occured";
log("Error: " . $code);
}
Второй пример
// Change this:
$customer->setProducts($products);
// To this:
if (!empty($products)) {
$customer->setProducts($products);
}
В первом примере я нахожу, что при назначении $e->getCode()
to $code
объявлений возникают небольшие когнитивные накладные расходы; "Что такое" код "? Ах, это код из исключения". В то время как второй пример добавляет циклическую сложность. В обоих примерах я нахожу, что оптимизация достигается за счет удобочитаемости и ремонтопригодности.
Значит ли это увеличение производительности или это микро-оптимизация?
Я должен отметить, что мы застряли с PHP 5.2 прямо сейчас.
Я провел очень грубые тесты на стенде и обнаружил, что производительность вызова функции составляет порядка 10% до 70% в зависимости от характера моего стендового теста. Я соглашусь, что это важно. Но до того, как этот блок блокировки попал, произошел вызов базы данных и конечной точки HTTP. Прежде чем $products
был установлен в $customer
, был сложный вид, который произошел с массивом $products
. В конце концов эта оптимизация оправдывает затраты на упрощение чтения и обслуживания кода? Или, хотя эти примеры являются упрощениями, кто-нибудь может найти 2-й пример так же легко или проще для чтения чем первый (я являюсь wiener)?
Может ли кто-нибудь привести какие-либо хорошие статьи или исследования об этом?
Изменить:
Пример тестового теста:
<?php
class Foo {
private $list;
public function setList($list) {
$this->list = $list;
}
}
$foo1 = new Foo();
for($i = 0; $i < 1000000; $i++) {
$a = array();
if (!empty($a))
$foo1->setList($a);
}
?>
Запустите этот файл с помощью команды time
. На одной конкретной машине она занимает в среднем 0,60 секунды после нескольких прогонов. Комментирование if (!empty($a))
заставляет его выполнять в среднем 3,00 секунды для запуска.
Разъяснение. Это примеры. Первый пример демонстрирует ужасную обработку исключений и возможное нарушение DRY за счет простого примера, не относящегося к домену.