初めまして・お久しぶり、こんにちは。
システム開発事業部の荒島です。

今回は『PHPのコピーオンライトについて』のPart4になります。

================
<COWの罠②>
COWは「プログラマーがメモリ管理を意識せずともメモリの節約が行われている」という素敵な仕組みです。
しかし、COWは気を付けないと「処理速度を遅くしている可能性がある」のです。

例えば、以下のサンプルだと処理速度が遅くなっています。

——–
【サンプル:コード】
$dataList = array(
‘test1’,
‘test2’,
// 略
);
$dataListTmp = $dataList;
foreach ($dataListTmp as $key => $val) {
// 略
}
unset($dataList);
unset($dataListTmp);

// 略
——–

何故、処理速度が遅くなるのかわかりますか?

・・・・・・excatly!!(←エイゴヤメロ)

10行目のunsetにより『コピー先($dataListTmp)より先にコピー元($dataList)が破棄されていることで、COWが行われてしまっている分だけ遅くなっている』のです。
破棄の際にCOWが行われないと、$dataListTmpが参照しているものが不明になるため、COWが行われるのは当然ですね。

コピー元の『データ量が大きい』『配列構造が複雑』場合は、その分だけ処理速度が遅くなるため、注意が必要になります。
変数で扱うデータが小さい・単純ではない場合、変更する前には「”変数の代入箇所~変更する直前”までの処理を見直す」ようにしましょう。

================

以上、『Part4:COWの罠』でした。
Part5へ続きます。