2011年10月16日(日)style sort.

文字列変換。「strtrとstr_replaceで似た様な事が出来る」と言うのは知っている。重要なのは「使い分ける基準をどこに設けるのか」。

まずはそれぞれのメリットとデメリットを明確にしておく事にする。
そうやって比較の対象をきちんと明示しない素人文章がここ最近のネット界隈には多すぎる。

strtr(arrayを噛まして変換する) → メリット:複数の文字を一気に変換出来る。 デメリット:回数が多くなればなる程、str_replaceよりも遅くなる。 
str_replace → メリット:strtrよりも速い。 デメリット:複数の文字を一気に変換する事が出来ない。

whileの間にstr_replaceを入れてwhileの回転分str_replaceの反すう処理を繰り返す事で複数の文字を一気に変換する方法も考えなくはないが
いちいちwhileで処理しなければならないと言ってる時点でソースコードが相当に肥大化する。「スマート」なコードが書けない。

スマート:本来の意味は「痩せている」に近いが、現代社会では「格好いい」と同義として扱う事が多数派。「スマートファルコン」(痩せているファルコン)ではない。

「回数が多くなればなる程」と書いたのは同じ様な事をやっても回数が少なければその差は感じずに居られるから。
同じ様な事を「100回」、「1000回」、「10000回」とループを実行して初めて処理速度の違いはハッキリとした形で明確な物となる。

…但し、普通の個人サイト程度の規模の中で同じループ処理は「10000回」もやりません。

従って、わざわざ書き直す必要は薄い。それが現実。しかし体感速度の向上と「知ってて書き直さないと言う行為は俺のプライドが許さない」。
以上2点の理由によって動作する速度には常に気を配ったスクリプトを構築する傾向は存在し続けて良い物と俺は考えている。

…しかしこの結果に関してはサーバーの性能の差異による記録の短縮もしくは遅延。そうした効果の側面も無視は出来ない。
「サーバーの性能が良ければ例え遅くなる書き方でも結果は良好」なんて言う事も割とある。

以下の実験結果を記す事には殆ど何の意味もない事になってしまう訳ではあるんだがまぁ参考程度と言う事で。

サーバー1:00100回:strtr(0.0002 sec)、str_replace(0.0001 sec)、preg_replace(0.0003 sec) 
サーバー1:01000回:strtr(0.0018 sec)、str_replace(0.0009 sec)、preg_replace(0.0018 sec) 
サーバー1:10000回:strtr(0.0183 sec)、str_replace(0.0093 sec)、preg_replace(0.0171 sec) 以下はサーバー1より遅めの別サーバーで計測。

サーバー2:00100回:strtr(0.0002 sec)、str_replace(0.0001 sec)、preg_replace(0.0004 sec) 
サーバー2:01000回:strtr(0.0017 sec)、str_replace(0.0010 sec)、preg_replace(0.0020 sec) 
サーバー2:10000回:strtr(0.0165 sec)、str_replace(0.0095 sec)、preg_replace(0.0174 sec) 以下はサーバー2より遅めの別サーバーで計測。

サーバー3:00100回:strtr(0.0004 sec)、str_replace(0.0002 sec)、preg_replace(0.0003 sec) 
サーバー3:01000回:strtr(0.0033 sec)、str_replace(0.0020 sec)、preg_replace(0.0026 sec) 
サーバー3:10000回:strtr(0.0298 sec)、str_replace(0.0191 sec)、preg_replace(0.0251 sec)

傾向1:strtrは回数が増えれば増えるほど遅くなる。 傾向2:全てにおいてstr_replaceが最も速い。

傾向3:「サーバー2:10000回:strtr(0.0165 sec)」と「サーバー3:10000回:str_replace(0.0191 sec)」を見れば分かる様に
やはりサーバー能力は考慮の範囲に入る。「strtrよりもstr_replaceの方がスクリプトとしては速い」が「サーバー能力によっては逆転する」現象がある。
それがサーバー能力を考慮に範囲に入れなければならないと言う何よりの証明となる。

懸念1:str_replaceはwhileの間で実行するなど工夫を行わない限り1度に複数の文字列を全て変換する事は出来ない。
懸念2:そもそも普通は回数を掛けてループする事はあまり無い。実際の使い方とは相反する内容は実用的ではない。

従って、結論は「使える所では可能な限りstr_replaceを使い、strtrを使う時には可能な限り処理の回数を小さくする。そしてなるべく高速なサーバーを使う」。となる。

「1:低速サーバーで低速スクリプト」、「2:低速サーバーで高速スクリプト」、「3:高速サーバーで低速スクリプト」、「4:高速サーバーで高速スクリプト」。
考えられるのは上記の4種類。比較は「2≒3」。こうなる。理想は「4」になるので、自分の頭の中では常に「4」のパターンを最善として行動している。

但し、現実的に個人サイトで行っているループの回数は多くてもせいぜい150回程度。従って「100回」実行した場合の数字が上記の中では1番現実的。
そこの数字を見れば分かる様にどのサーバーでも違いはない。あくまでも「厳密に」計測したらこの様な違いになりました、と言う事を書いているだけであって
PHPは書き方によってこれだけの違いが生まれるですね、と言う内容をまずは書きたい内容としての最初の事項として提出を行い、従って
乱暴な書き方ではなく高速性能とサーバー負荷の軽減と言った2つのお題目をしっかりと意識して書きましょう。と言った内容が結論となる。以上。

2011年10月16日(日)19時47分35秒