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.4k
フロントエンドが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
230
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.6k
Other Decks in Technology
See All in Technology
サラリーマンソフトウェアエンジニアのキャリア
yuheinakasaka
42
20k
Node vs Deno vs Bun 〜推しランタイムを見つけよう〜
kamekyame
1
570
エンジニアとして長く走るために気づいた2つのこと_大賀愛一郎
nanaism
0
210
Introduction to Sansan Meishi Maker Development Engineer
sansan33
PRO
0
340
純粋なイミュータブルモデルを設計してからイベントソーシングと組み合わせるDeciderの実践方法の紹介 /Introducing Decider Pattern with Event Sourcing
tomohisa
1
1.3k
Behind the Stream - How AbemaTV Engineers Build Video Apps at Scale
ygoto3
0
120
AIAgentを駆使してSREが貢献する開発体験の向上
yoshiiryo1
3
910
多様な最適化サービス開発をスケールさせる共通基盤とチーム構成
algoartis
0
110
アウトプットはいいぞ / output_iizo
uhooi
0
140
なぜCREを8年間続けているのか / cre-camp-4-2026-01-21
missasan
0
960
20260114_データ横丁 新年LT大会:2026年の抱負
taromatsui_cccmkhd
0
360
Kiro Power - Amazon Bedrock AgentCore を学ぶ、もう一つの方法
r3_yamauchi
PRO
0
110
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
150
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.3k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
2
300
We Are The Robots
honzajavorek
0
140
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.4k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
110
So, you think you're a good person
axbom
PRO
2
1.9k
How to Ace a Technical Interview
jacobian
281
24k
Odyssey Design
rkendrick25
PRO
0
470
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とか....
おしまい