
パフォーマンスを意識するロジックの書き方
-
2022年5月25日
概要
こんにちは、『ポケコロ』のサーバー開発のXです。
今回は、普段の開発におけるソースレビューを通じて見つかった改善点を紹介したいと思います。
オンラインゲームやソーシャル系のアプリでは、サーバー側は常に大量のデータを扱っています。細かい修正でも積み重なると大きなパフォーマンス改善になりますので、この辺を常に意識して開発に取り組むことが大切です。
複数条件
例として、あるアイテムを所持してる場合に10%の確率で当たるという仕様の実装だと、javaではこのような感じで書きます。
改善すべきところがお分かりですか?
そうです!条件に必要なデータを全て揃えるのではなく、段階的に取得したほうが効率のいい書き方になります。下記のように直すことで、DBへのアクセスを90%減らすことができます。
DBにアクセスする処理の場合、軽い処理を優先させることによってDBの負荷軽減に繋がります。
データ取得①
1つ目の例の中に、実はもう1点改善できる部分があるのですが、気づきましたか?
ユーザーが特定のアイテムを所持してるかのチェックをする際に、所持アイテムをすべて取得していました。
しかし、実際は必要なアイテムだけを取得すれば問題ないため、クエリの改善を行ってみます。
たとえDBのindexがあっても、必要な分だけを取得するようにしましょう。
データ取得②
ほかに下記のようなパターンもよくあります。
こちらは、ポケとも(アプリ内のフレンド)の持ち物リストを表示した時に、リスト内のアイテムを自分も持っていることを示すflagを返すための実装です。
こちらも同様に、自分の全ての所持アイテムデータを取得するよりも、1ページ分のアイテムのデータだけを取得したほうがパフォーマンスの良い実装になります。
データ取得③
最後に、ループ内でDBへのアクセスも可能な限りしないように実装を行いましょう。
普段はそういうことをしないと思いますが、既存のメソッドを呼んでデータを整形したり関連情報を取り出す場合に気づかずに行なってしまうケースが多いです。
今回は具体例は割愛しますが、ループ内でメソッドを呼び出す場合には中身をしっかりと確認したりしたほうがいいでしょう。
まとめ
今回は4つの典型的な例を紹介しました。
どれも難しいことではなくシンプルなものですが、シンプルなものこそ気づきにくいかもしれないのですね。
ココネでは一緒に働く仲間を募集中です。
ご興味のある方は、ぜひこちらの採用特設サイトをご覧ください。