PHPの処理を高速化させるための一工夫
どうも、トーマスです。
現在、ぷにぷに毛玉ねこ(以下ねこ)というゲームの開発もしています。
ねこのAPPサーバーはAWSのautoscalingを使用しています。
が、このautoscalingが曲者で、、、
いや正常と言うべきですね。
autoscalingは設定された負荷の値になると自動でサーバーを立ち上げます。
そりゃー、autoですからね。。。
でもサーバーの負荷が上がったのって大量のアクセスがあったからでしょうか?
。。。
そうともいいきれません。
php側の実装でメモリやCPUを無駄使いしている場合もあります。
つまりサーバーを無駄に立ち上げてしまっているかもしれないという事です。
ああああ、困ったーー。
なので、こういった時は初心に帰って基礎から作りなそう!
と決意して作り直しました。
結論から言うと
その結果、平均数十台必要だったサーバーが数台にまで減らせました!!
やったー!!
という事で、今日はphpの実装の時の一工夫を書こうと思います。
まぁメモ的な感じで見て頂ければと思います。
無駄に関数を呼ばない&ローカル変数にキャッシュする
ループの中で無駄に関数を呼ばない。
1 2 3 |
[sourcecode lang="text"] for ($i = 0; $i < count($result); $i++) [/sourcecode] |
↓
1 2 3 4 |
[sourcecode lang="text"] $count = count($result); for ($i = 0; $i < $count; $i++) [/sourcecode] |
同じ判定なら一回ローカルにキャッシュする。
1 2 3 4 5 6 7 |
[sourcecode lang="text"] foreach ($array as $key => $value) { if ($key > count($result)) { echo $value; } } [/sourcecode] |
↓
1 2 3 4 5 6 7 8 |
[sourcecode lang="text"] $count = count($result); foreach ($array as $key => $value) { if ($key > $count) { echo $value; } } [/sourcecode] |
関数の結果が同じものであれば一回ローカル変数にキャッシュした方が断然早いです。
上記の例だとピンとこないかもしれませんので、実用例を少し書くと、下記例のようにsymfonyのaction内で表示用に配列や値を加工する時は一度ローカル変数にキャッシュして表示するのに必要なものだけを表示用の変数にわたします。
(あ!!ちなみにねこの実装はsymfonyで行っています。)
1 2 3 4 5 |
[sourcecode lang="text"] $this->items = ItemPeer::gets(); ... $this->itemで処理を書く [/sourcecode] |
↓
1 2 3 4 5 |
[sourcecode lang="text"] $items = ItemPeer::gets(); ... $itemsで処理を書き必要なものだけ$this->にセットしてあげる。 [/sourcecode] |
アクセス時に必ず関わるメソッドなので特に気をつけます。
また、メソッド内の処理だけで考えれば、グローバル変数を一回ローカル変数にキャッシュする事でメモリの緩和になりますからね。
※どの言語でも同じですよね。。。
DBから取得した値もローカル変数にキャッシュしてから加工して各ロジックや変数にセットします。
※DBへのアクセス数を削減する設計的な話は割愛して。。。これはまたの機会に☆彡、
え?
これだけ??
って思うかもしれませんが、徹底してやれば1kや2kの削減でも、積もって数Mの削減になります。
ちなみに当初は1プロセスの使用メモリが100M~150M以上あったのですが、改善後は60M~90M位まで削減出来ました。
って、もともとの実装がいけてないのでは?
って思ってしまうでしょうが、そんな事ないんです。
1ページの表示に必要なデータ量やSQL文を考えると結構なメモリとCPUが必要だと思います。
でも、一個一個丁寧に実装してあげれば思ってる以上に効果がでます。
ソーシャルアプリのような開発のスピードが求められる案件を一個一個改修して検証なんてやってたら気が遠くなるし他の開発が遅れてしまう!!
って思うかもしれませんが、やるのは一回だけ!っと思ってやれば、後々自分や関わる人たちが凄く楽になります☆彡
いろんな削減方法はあるとは思いますが
やはり基礎がしっかりしていれば多少の無理なら耐えれます!!
php実装の一工夫のお話でしたー
ではまた!!