PHP

同じプロパティを何度も参照するより変数に代入してから参照するほうが速い

同じプロパティを何度も参照しているコードを見かけ、「それは遅いだろう」と思ったのですが、実際にどのくらい遅くなるのか気になったので、簡単なベンチマークスクリプトで確認してみました。

<?php
$obj1 = new stdClass;
$obj1->foo = 'bar';

$obj2 = new stdClass;
$obj2->foo = new stdClass;
$obj2->foo->bar = 'baz';

$obj1_foo = $obj1->foo;
$obj2_foo_bar = $obj2->foo->bar;

$start = microtime(true);
for ($i = 1; $i <= 10000000; $i++) {$obj1->foo;}
$end = microtime(true);
echo '$obj1->foo      : ', $end - $start, "\n";

$start = microtime(true);
for ($i = 1; $i <= 10000000; $i++) {$obj2->foo->bar;}
$end = microtime(true);
echo '$obj2->foo->bar : ', $end - $start, "\n";

$start = microtime(true);
for ($i = 1; $i <= 10000000; $i++) {$obj1_foo;}
$end = microtime(true);
echo '$obj1_foo       : ', $end - $start, "\n";

$start = microtime(true);
for ($i = 1; $i <= 10000000; $i++) {$obj2_foo_bar;}
$end = microtime(true);
echo '$obj2_foo_bar   : ', $end - $start, "\n";
$obj1->foo      : 0.19446301460266
$obj2->foo->bar : 0.30430507659912
$obj1_foo       : 0.094012975692749
$obj2_foo_bar   : 0.094088077545166

というわけで、$obj1->foo なら変数を2回、$obj2->foo->bar なら変数を3回、参照するのと同じくらい時間がかかるのだと分かりました。雑な理解ではありますが、リファクタリングの効果を推測する際の参考にはなるかと思います。