ラベル 制御構造 の投稿を表示しています。 すべての投稿を表示
ラベル 制御構造 の投稿を表示しています。 すべての投稿を表示

2013年5月6日月曜日

配列のメモリの話 その2

今回は制御構造とメモリ使用量の関係について調べてみます。

サンプルコード 実行結果
memory 1:160
memory 2:128
memory 3:0
個人的な予想に反してforよりforeachの方が省メモリであるという結果が出ました。
コードの書き方を何か間違えたかな…と思ったのですが原因についてはよく分かりませんでした。
listとeachを使ったループが最も省メモリであるのは予想通りです。
とても大きな配列をループさせる時はlistとeachで回すのも一つの方法かもしれませんね。

2013年4月28日日曜日

Iterator

Iteratorとは反復処理を行うための機能のことです。
今回はこの機能を用いてforeachについて学んでみます。

サンプルコード 実行結果
string(18) "myIterator::rewind"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
0 => firstelement
string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
1 => secondelement
string(16) "myIterator::next"
string(17) "myIterator::valid"
string(19) "myIterator::current"
string(15) "myIterator::key"
2 => lastelement
string(16) "myIterator::next"
string(17) "myIterator::valid"
この結果から分かるように、foreachは
  1. 最初の要素に戻る
  2. (現在の要素が有効か)チェックする
  3. 要素を返す
  4. キーを返す
  5. 次へ
といった順序を辿っていきます。

ちなみに、オブジェクトへのforeachがこのようにクラス内メソッドを決められた順序で辿っていくのは
Iteratorインタフェースを実装したクラスの時のみです。

2013年4月13日土曜日

forを使おう

再帰的な処理を行うにはforとwhileの2通りがあります。
どちらを使うかは個人の自由ですし、その時の状況に応じてというのもあるかもしれません。
ただ、私はどちらかと言えばforを使うことをオススメします。

forの利点としましては一行に
  • 初期化
  • 再帰の終了条件
  • 終了条件に至るプロセス
をまとめることができます。
つまり、このような処理は と一行にまとめることができます。 さらに、$iの値にはこだわらず、10回ループさせたいだけなら、 と書くことも可能です。

ちなみに、forとwhileのベンチマークです。

サンプルコード 実行結果
BenchMark 1 average:0.0053820133209229
BenchMark 2 average:0.0054374217987061
と、わずかばかりforの方が速いようです。

2013年4月12日金曜日

コード短縮手法5

今回はコード短縮手法というよりコーディングルールのようなものです。
ネストを極力深くしないようにするため、if文の条件を && で繋ぎましょう。

サンプルコード 実行結果
BenchMark 1 average:0.0039301872253418
BenchMark 2 average:0.003798246383667
と、後者のほうが早かったりします。

2013年3月24日日曜日

オブジェクトの反復処理

マニュアルを眺めていて知った小ネタです。
foreachなどを使用することによって
そのスコープからアクセス可能なメンバ変数全てを取得することができます。

サンプルコード 実行結果
var1 => value 1
var2 => value 2
var3 => value 3

MyClass::getProperty:
var1 => value 1
var2 => value 2
var3 => value 3
protected => protected var
private => private var
使うかな。使わなそうだなぁ…。

2013年3月17日日曜日

ループ内での要素の変更

配列のマニュアルを読んでいたら良さそうな例を見かけたので
メモ&ベンチマークです。

サンプルコード 実行結果
BenchMark 1     average:0.032666206359863
BenchMark 2     average:0.032941651344299
これからはパターン1で行こうと思います。

おかしな挙動?

最近になってPHPでどうしても理解できない挙動をする式を見つけました。
以下、そのサンプルコードと実行結果です。

サンプルコード 実行結果
1211
パターン1とパターン3、パターン2とパターン4が同じ結果になると思ったのですが、そうはなりませんでした。
パターン4の条件式ですが、普通に解釈すると右から解釈するので
$aに0が代入され、その$aをbooleanにキャストするのでFALSEになる筈なのですが…?
原因はわかりませんが、(bool)の型キャスト部分を消すと実行結果は1212と予想通りになります。
ともあれ、三項演算子と型キャストを同時に使うのは避けたほうがよさそうです。

2013年3月15日金曜日

コード短縮手法4

コードの短縮手法として有名なものに三項演算子があります。
では、三項演算子のパフォーマンスについて調べてみましょう。

サンプルコード 実行結果
BenchMark 1     average:0.01190493106842
BenchMark 2     average:0.012681221961975
三項演算子は遅いという印象はありましたが
この結果を見る限りではそこまで遅くはないようですね。

elseとcontinue

if文を書くときにelseとcontinueのどちらを使うのがベターなのでしょうか。
ベンチマークを取って調べてみましょう。

サンプルコード 実行結果
BenchMark 1     average:0.51706559658051
BenchMark 2     average:0.51087384223938
この結果を見るには大差無さそうですね。

2013年3月13日水曜日

厳密なチェックを

PHPには「==」と「===」という2種類のチェック方法があります。
前者は単純に文字列の比較だけ、
後者は厳密に型チェックまで行うというのは周知のことかと思います。
ではベンチマークを取ってみましょう。

サンプルコード 実行結果
BenchMark 1     average:0.0028216361999512
BenchMark 2     average:0.0024353981018066
と、後者のほうが速いです。
厳密にチェックしている方が実行速度が速いというのも不思議な感じがしますね。
不慮の事故を防ぐためにも、「===」でのチェックを積極的に使っていきましょう。

コード短縮手法3

小ネタです。
if文の書き方でひとつ。

サンプルコード 実行結果
BenchMark 1     average:0.014285373687744
BenchMark 2     average:0.013172221183777
とまあ、わずかばかり後者のほうが速かったりもします。

コード短縮手法2

コード短縮手法、第二回目です。
今回はif文の短縮手法をご紹介します。

サンプルコード 実行結果
FLAG1
FLAG1
FLAG2
FLAG2
いかがでしょうか。
条件の真偽さえ間違えなければ便利な書き方といえるのではないでしょうか。
ただし、この書き方はelse節が無いことが前提条件です。
else節がある場合は三項演算子を使うのがコードの短縮になるかと思います。

ではベンチマークも取ってみましょう。

サンプルコード 実行結果
BenchMark 1 average:0.010251259803772
BenchMark 2 average:0.0099292039871216
サンプルコード 実行結果
BenchMark 1     average:0.10526418685913
BenchMark 2     average:0.10484325885773
このような結果になりました。
限定的な場合だけ通じる書き方ですが、一度試してみてはいかがでしょうか。

コード短縮手法1

普段簡単なコードを書く時はできるだけ手短に書きたいものです。
今回はfor文を簡単に書く方法をご紹介します。

サンプルコード 実行結果
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
いかがでしょうか。
ポイントは初期化の時に1引く点、後置インクリメントが前置インクリメントになる点と
echoではなくprintを使う点です。
ここでprintではなくechoを書きますとエラーが起きます。

ベンチマークも取ってみましょう。

サンプルコード 実行結果
BenchMark 1 average:0.10385200977325
BenchMark 2 average:0.10636031627655
自分だけが見るコードでしたら少々トリッキーなこんな書き方もアリではないでしょうか。