Laravel Collectionの計算量を調べてみた2023/laravel_collection_time_complexity_2023
by
Ryo Tomidokoro
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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
おしまい