LoginSignup
3
1

More than 5 years have passed since last update.

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

Posted at

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

<?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回、参照するのと同じくらい時間がかかるのだと分かりました。雑な理解ではありますが、リファクタリングの効果を推測する際の参考にはなるかと思います。

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1