FizzBuzz問題からループ処理の書き方を考えてみる
みんな大好きFizzBuzz。人によって回答がまちまちだから「じゃあマトモなソースってどう書けばいいの?」と思ったので実験してみました。
PHPで試してみる。計測はmicrotime関数を使って、実行後から実行前の時間を引いて算出しています。
例1
最初にFizzBuzzを求めて、elseifでそれ以外を求めていく。
<?php for ( $i = 1; $i <= 10000000; $i++ ) { if ( ( $i % 3 === 0 ) && ( $i % 5 === 0 ) ) { // echo 'FizzBuzz'.PHP_EOL; } elseif ( $i % 3 === 0 ) { // echo 'Fizz'.PHP_EOL; } elseif ( $i % 5 === 0 ) { // echo 'Buzz'.PHP_EOL; } else { // echo $i.PHP_EOL; } }
結果
1.8721768856049 seconds 1.8715240955353 seconds 1.8646130561829 seconds 1.9092321395874 seconds
例2
FizzとBuzzを求めながら文字列を結合していく。
<?php for ( $i = 1; $i <= 10000000; $i++ ){ if ( ( $i % 3 ) === 0 ){ // echo 'Fizz'; } if ( ( $i % 5 ) === 0 ){ // echo 'Buzz'; } if ( ( $i % 3 ) && ( $i % 5 ) ){ // echo $i; } // echo PHP_EOL; }
結果
2.1766121387482 seconds 2.0753118991852 seconds 2.0881280899048 seconds 2.0765881538391 seconds
当然の結果だけど、ループの中で読むコードが少なければ少ないほど早い。ループ処理を書くときは、如何にコードを短く実行させるか、になってくるわけですね。なるほど、言われたらわかるけどあまり意識していませんでした。ぐぬぬ。