Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Laravel Collectionの計算量を調べてみた2023/laravel_collection_time_complexity_2023
Search
Ryo Tomidokoro
June 23, 2023
Technology
0
980
Laravel Collectionの計算量を調べてみた2023/laravel_collection_time_complexity_2023
Laravel Verison 10 と PHP8.2 で調査しなおしました。
Ryo Tomidokoro
June 23, 2023
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.9k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
3.7k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
4
1.6k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
12
5k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
14
11k
PHP で学ぶ Cache の距離の話 / study_cache_with_php
hanhan1978
7
1.9k
Laravel を低速化する技術 / how to slow laravel
hanhan1978
2
3.2k
俺の Laravel がこんなに速いわけがない! / My Laravel Too Fast
hanhan1978
1
1.8k
カンファレンスで登壇するとどうなるのか? / PHPTechCafe PHPerKaigi 2022
hanhan1978
3
400
Other Decks in Technology
See All in Technology
Goでテストをしやすくするためにやったこと
kazukihayase
1
510
生成AIの活用方法 - 2024年現在、 結局どのように使えばいいのだろうか? / How to use Generative AI in 2024
nttcom
3
360
AWS Control Towerと HashiCorp Terraformでいい感じにマルチアカウント管理をしよう
chazuke4649
0
400
テストスライド
kokorozashiseki
0
170
データ分析力を高めるSQL研修『SQL Everyone』のご紹介【SQL勉強会 #3】
hikarut
1
150
go get で考慮している ファイルシステムの挙動について
shinnosuke_kishida
3
580
その失敗から何を学ぶ?不確実性をマネジメントして目標達成するための心得 #webtan
aki_iinuma
19
5.3k
Safie Viewer for iOS の 技術的負債との付き合い方
safie
0
120
lintnet - General purpose linter powered by Jsonnet
szksh
4
140
エレガントパズル エンジニアのマネジメントという難問にあなたはどう立ち向かうのか / Elegant Puzzle
iwashi86
13
2.4k
内製したSlack Appで頑張るIncident Response@Waroom Meetup #1 / Incident Response with Slack App in 10X
sota1235
0
420
Platform Orchestrators: The Missing Middle of Internal Developer Platforms?
syntasso
1
160
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
34
13k
The Invisible Side of Design
smashingmag
294
50k
Embracing the Ebb and Flow
colly
80
4.2k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
34
9k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
5
230
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
221
21k
Designing the Hi-DPI Web
ddemaree
276
33k
The MySQL Ecosystem @ GitHub 2015
samlambert
244
12k
The Illustrated Children's Guide to Kubernetes
chrisshort
34
47k
Building Your Own Lightsaber
phodgson
101
5.8k
Design by the Numbers
sachag
276
18k
Product Roadmaps are Hard
iamctodd
46
9.9k
Transcript
@hanhan1978 Laravel Collectionの計算量を調べてみた 2023年度版 (非公式)PHPカンファレンス福岡 前夜祭 2023/06/23
@hanhan1978 • 富所 亮 • 所属 株式会社カオナビ BackEnd Re-architecturing Team
(BERT) • 職業 バックエンドエンジニア • ブログ https://blog.hanhans.net • Yokohama North AM https://anchor.fm/yokohama-north-am 2
2018年に発表していた内容を最新バー ジョンでやってみました
これの2023年版 Laravel Version 5.7
計算量についておさらい 本日は時間計算量を扱います
https://speakerdeck.com/hanhan1978/basic-knowledge-of-space-complexity 空間計算量については、こっちのスライドを参照
例えばレビューしている時
「この処理遅そう」 これだと分かりにくい。 処理の時間的速度を共通知識で伝えたい
英語だと Time Complexity 時間複雑性 プログラムの処理に どれくらい時間がかかるかを 数学的に扱う
O記法 O(1) O(log n) O(n) O(n * log n) O(n^2)
プログラムの時間的計算量を表す
O記法 データ量が増加した場合の 処理時間の増加傾向が分かる
http://www.techscore.com/blog/2016/08/08/開発新卒に捧ぐ、基本のアルゴリズムと計算量 / データ量と計算量 [グラフ引用] 開発新卒に捧ぐ、基本のアルゴリズムと計算量
計算量とアルゴリズム アルゴリズム 計算量 バブルソート O(n^2) マージソート O(n log n) バイナリサーチ
O(log n) アルゴリズムによって計算量が異なる
さらに詳しく知りたい人 数学ガール4 乱択アルゴリズム 2章と6章を読むべし
Laravel Collection各メソッドの計算量
細かすぎて見えない!
share しておきます https://docs.google.com/spreadsheets/d/1RbHo6huSTBkdSpWoCMRyS0E5bBvaYJdWUO3NHL VFfYg/edit?usp=sharing
雑にまとめると
• ほとんど O(n) O(1) • O(n^2) 以上が30個
要注意メソッド • crossJoin O(n^t) • diff系 O(n^t) • flat系 O(n^t)
• flatten系 O(n^2) • merge系 O(n^2) • intersect系 O(n^2)
実測してみた
where - O(n)
count - O(1)
shift - O(n^2)
計算量が分かったとして 何か良いことあるのか?
知らないと悪いことが起きる
実際にあったかもしれない 計算量が問題になったコード例 ※実話を元にしたフィクション
全件取得 ページングのために全 件ループで回す 例1
全件取得 ページングのために全 件ループで回す 例1 ページの後半に行けば行くほど ループが回って遅くなる O(n)
例2 第1ループで全件回す O(n) 第2ループも全件回す O(n)
合わせ技 O(n^2) O(n)を入れ子にすればパワーアップ 例2 第1ループで全件回す O(n) 第2ループも全件回す O(n)
例2 第1ループで全件回す O(n) 第2ループも全件回す O(n) 第一引数は最大で数百件程度だったが 第二引数のデータ数が成長していくと…
事前に検知できないか?
実は例1・2のコードは 単体テスト -> 通過 受け入れテスト -> 通過 通過してしまっていた…
データが増えないと問題にならない
http://www.techscore.com/blog/2016/08/08/開発新卒に捧ぐ、基本のアルゴリズムと計算量 / データ量と計算量(再掲) [グラフ引用] 開発新卒に捧ぐ、基本のアルゴリズムと計算量
負荷テスト コードレビュー 事前検出可能な砦
負荷テスト データ量が莫大になることが わかっているプロダクトは行っている。 通常のプロダクトだと あんまりやってるの見たこと無い。
コードレビュー レビュアーのスキルや経験に依存 事前に計算量について チーム内で勉強会とかしてれば 指摘&修正は簡単だと思う
監視ツールで、処理時間のメトリクスを見て 理詰めで処理時間の遅い部分を特定できれば まあ、及第点だと思う。 最悪見逃しても
まとめ
• 計算量はデータのサイジングが肝 • データ量がすくないなら、問題にならない • 過剰品質には気をつけよう! バランスの良い判断をしよう
おまけ
計算量が一目瞭然
データの集まりを扱うプログラムは 計算量を確認しましょう
random 8.2 で Random が改善
たまに、Laravel側の実装変更で思いっき り劣化することがあるので注意! uniqueとか....
おしまい