Slide 1

Slide 1 text

@hanhan1978 Laravel Collectionの計算量を調べてみた 2023年度版 (非公式)PHPカンファレンス福岡 前夜祭 2023/06/23

Slide 2

Slide 2 text

@hanhan1978 ● 富所 亮 ● 所属 株式会社カオナビ BackEnd Re-architecturing Team (BERT) ● 職業 バックエンドエンジニア ● ブログ https://blog.hanhans.net ● Yokohama North AM https://anchor.fm/yokohama-north-am 2

Slide 3

Slide 3 text

2018年に発表していた内容を最新バー ジョンでやってみました

Slide 4

Slide 4 text

これの2023年版 Laravel Version 5.7

Slide 5

Slide 5 text

計算量についておさらい 本日は時間計算量を扱います

Slide 6

Slide 6 text

https://speakerdeck.com/hanhan1978/basic-knowledge-of-space-complexity 空間計算量については、こっちのスライドを参照

Slide 7

Slide 7 text

例えばレビューしている時

Slide 8

Slide 8 text

「この処理遅そう」 これだと分かりにくい。 処理の時間的速度を共通知識で伝えたい

Slide 9

Slide 9 text

英語だと Time Complexity 時間複雑性 プログラムの処理に どれくらい時間がかかるかを 数学的に扱う

Slide 10

Slide 10 text

O記法 O(1) O(log n) O(n) O(n * log n) O(n^2) プログラムの時間的計算量を表す

Slide 11

Slide 11 text

O記法 データ量が増加した場合の 処理時間の増加傾向が分かる

Slide 12

Slide 12 text

http://www.techscore.com/blog/2016/08/08/開発新卒に捧ぐ、基本のアルゴリズムと計算量 / データ量と計算量 [グラフ引用] 開発新卒に捧ぐ、基本のアルゴリズムと計算量

Slide 13

Slide 13 text

計算量とアルゴリズム アルゴリズム 計算量 バブルソート O(n^2) マージソート O(n log n) バイナリサーチ O(log n) アルゴリズムによって計算量が異なる

Slide 14

Slide 14 text

さらに詳しく知りたい人 数学ガール4 乱択アルゴリズム 2章と6章を読むべし

Slide 15

Slide 15 text

Laravel Collection各メソッドの計算量

Slide 16

Slide 16 text

細かすぎて見えない!

Slide 17

Slide 17 text

share しておきます https://docs.google.com/spreadsheets/d/1RbHo6huSTBkdSpWoCMRyS0E5bBvaYJdWUO3NHL VFfYg/edit?usp=sharing

Slide 18

Slide 18 text

雑にまとめると

Slide 19

Slide 19 text

• ほとんど O(n) O(1) • O(n^2) 以上が30個

Slide 20

Slide 20 text

要注意メソッド • crossJoin O(n^t) • diff系 O(n^t) • flat系 O(n^t) • flatten系 O(n^2) • merge系 O(n^2) • intersect系 O(n^2)

Slide 21

Slide 21 text

実測してみた

Slide 22

Slide 22 text

where - O(n)

Slide 23

Slide 23 text

count - O(1)

Slide 24

Slide 24 text

shift - O(n^2)

Slide 25

Slide 25 text

計算量が分かったとして 何か良いことあるのか?

Slide 26

Slide 26 text

知らないと悪いことが起きる

Slide 27

Slide 27 text

実際にあったかもしれない 計算量が問題になったコード例 ※実話を元にしたフィクション

Slide 28

Slide 28 text

全件取得 ページングのために全 件ループで回す 例1

Slide 29

Slide 29 text

全件取得 ページングのために全 件ループで回す 例1 ページの後半に行けば行くほど ループが回って遅くなる O(n)

Slide 30

Slide 30 text

例2 第1ループで全件回す O(n) 第2ループも全件回す O(n)

Slide 31

Slide 31 text

合わせ技 O(n^2) O(n)を入れ子にすればパワーアップ 例2 第1ループで全件回す O(n) 第2ループも全件回す O(n)

Slide 32

Slide 32 text

例2 第1ループで全件回す O(n) 第2ループも全件回す O(n) 第一引数は最大で数百件程度だったが 第二引数のデータ数が成長していくと…

Slide 33

Slide 33 text

事前に検知できないか?

Slide 34

Slide 34 text

実は例1・2のコードは 単体テスト -> 通過 受け入れテスト -> 通過 通過してしまっていた…

Slide 35

Slide 35 text

データが増えないと問題にならない

Slide 36

Slide 36 text

http://www.techscore.com/blog/2016/08/08/開発新卒に捧ぐ、基本のアルゴリズムと計算量 / データ量と計算量(再掲) [グラフ引用] 開発新卒に捧ぐ、基本のアルゴリズムと計算量

Slide 37

Slide 37 text

負荷テスト コードレビュー 事前検出可能な砦

Slide 38

Slide 38 text

負荷テスト データ量が莫大になることが わかっているプロダクトは行っている。 通常のプロダクトだと あんまりやってるの見たこと無い。

Slide 39

Slide 39 text

コードレビュー レビュアーのスキルや経験に依存 事前に計算量について チーム内で勉強会とかしてれば 指摘&修正は簡単だと思う

Slide 40

Slide 40 text

監視ツールで、処理時間のメトリクスを見て 理詰めで処理時間の遅い部分を特定できれば まあ、及第点だと思う。 最悪見逃しても

Slide 41

Slide 41 text

まとめ

Slide 42

Slide 42 text

● 計算量はデータのサイジングが肝 ● データ量がすくないなら、問題にならない ● 過剰品質には気をつけよう! バランスの良い判断をしよう

Slide 43

Slide 43 text

おまけ

Slide 44

Slide 44 text

計算量が一目瞭然

Slide 45

Slide 45 text

データの集まりを扱うプログラムは 計算量を確認しましょう

Slide 46

Slide 46 text

random 8.2 で Random が改善

Slide 47

Slide 47 text

たまに、Laravel側の実装変更で思いっき り劣化することがあるので注意! uniqueとか....

Slide 48

Slide 48 text

おしまい