私は比較的 PHP に不慣れで、言語固有の特異性をゆっくりと学んでいます。私がよく悩まされることの 1 つは、私が (そう言われているように) あまりにも多くの関数呼び出しを使用し、一般的にそれらを回避するために何かをするように求められることです。以下に 2 つの例を示します。
// 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);
}
2番目の例
// Change this:
$customer->setProducts($products);
// To this:
if (!empty($products)) {
$customer->setProducts($products);
}
最初の例では、広告にわずかな認知オーバーヘッドを割り当てる$e->getCode()
ことがわかりました。$code
「'$code' とは何ですか? ああ、それは例外からのコードです。」一方、2 番目の例では、循環的な複雑さが追加されます。どちらの例でも、最適化によって読みやすさと保守性が犠牲になっていることがわかりました。
パフォーマンスの向上はそれだけの価値がありますか、それともこのマイクロ最適化ですか?
私たちは今のところ PHP 5.2 で立ち往生していることに注意してください。
非常に大まかなベンチ テストを行ったところ、ベンチ テストの性質に応じて、関数呼び出しのパフォーマンス ヒットが 10% から 70% 程度になることがわかりました。これが重要であることは認めます。しかし、catch ブロックがヒットする前に、データベースと HTTP エンドポイントへの呼び出しがありました。$products
が設定される前に$customer
、配列に複雑な並べ替えが発生しました$products
。結局のところ、この最適化は、コードの読み取りと保守を難しくするコストを正当化するものでしょうか? または、これらの例は単純化されていますが、2 番目の例が最初の例と同じくらい簡単または読みやすいと思う人はいますか (私はウィーナーです)。
これに関する良い記事や研究を引用できる人はいますか?
編集:
ベンチテストの例:
<?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 違反の可能性を示しています。