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_collec...
Search
Ryo Tomidokoro
June 23, 2023
Technology
1
1.9k
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
開発者が知っておきたい複雑さの正体/where-the-complexity-comes-from
hanhan1978
8
3.3k
Spec Driven Development入門/spec_driven_development_for_learners
hanhan1978
2
1.5k
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
8
13k
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
14k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
240
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
3.4k
集中して作業する技術/how_to_work_deeply
hanhan1978
65
54k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
11k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
4.7k
Other Decks in Technology
See All in Technology
CDK対応したAWS DevOps Agentを試そう_20260201
masakiokuda
1
430
Context Engineeringが企業で不可欠になる理由
hirosatogamo
PRO
3
680
【Ubie】AIを活用した広告アセット「爆速」生成事例 | AI_Ops_Community_Vol.2
yoshiki_0316
1
120
学生・新卒・ジュニアから目指すSRE
hiroyaonoe
2
770
生成AIと余白 〜開発スピードが向上した今、何に向き合う?〜
kakehashi
PRO
0
160
SRE Enabling戦記 - 急成長する組織にSREを浸透させる戦いの歴史
markie1009
0
170
生成AIを活用した音声文字起こしシステムの2つの構築パターンについて
miu_crescent
PRO
3
220
22nd ACRi Webinar - NTT Kawahara-san's slide
nao_sumikawa
0
110
Cloud Runでコロプラが挑む 生成AI×ゲーム『神魔狩りのツクヨミ』の裏側
colopl
0
140
Bill One急成長の舞台裏 開発組織が直面した失敗と教訓
sansantech
PRO
2
410
20260208_第66回 コンピュータビジョン勉強会
keiichiito1978
0
200
Claude Code for NOT Programming
kawaguti
PRO
1
110
Featured
See All Featured
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
110
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
120
Visualization
eitanlees
150
17k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
130
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
430
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.1k
Done Done
chrislema
186
16k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.7k
Producing Creativity
orderedlist
PRO
348
40k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
61
52k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
290
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とか....
おしまい