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

当然の結果だけど、ループの中で読むコードが少なければ少ないほど早い。ループ処理を書くときは、如何にコードを短く実行させるか、になってくるわけですね。なるほど、言われたらわかるけどあまり意識していませんでした。ぐぬぬ