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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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.4k
Spec Driven Development入門/spec_driven_development_for_learners
hanhan1978
2
1.7k
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
8
14k
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
15k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
250
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
3.5k
集中して作業する技術/how_to_work_deeply
hanhan1978
65
55k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
11k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
4.8k
Other Decks in Technology
See All in Technology
[E2]CCoEはAI指揮官へ。Bedrock×MCPで構築するコスト・セキュリティ自律運用基盤
taku1418
0
150
会社紹介資料 / Sansan Company Profile
sansan33
PRO
16
410k
AI時代の「本当の」ハイブリッドクラウド — エージェントが実現した、あの頃の夢
ebibibi
0
110
社内レビューは機能しているのか
matsuba
0
120
情シスのための生成AI実践ガイド2026 / Generative AI Practical Guide for Business Technology 2026
glidenote
0
230
ランサムウエア対策してますか?やられた時の対策は本当にできてますか?AWSでのリスク分析と対応フローの泥臭いお話。
hootaki
0
130
ナレッジワーク IT情報系キャリア研究セッション資料(情報処理学会 第88回全国大会 )
kworkdev
PRO
0
190
堅牢.py#2 LT資料
t3tra
0
140
Evolution of Claude Code & How to use features
oikon48
1
600
AI実装による「レビューボトルネック」を解消する仕様駆動開発(SDD)/ ai-sdd-review-bottleneck
rakus_dev
0
120
Claude Code のコード品質がばらつくので AI に品質保証させる仕組みを作った話 / A story about building a mechanism to have AI ensure quality, because the code quality from Claude Code was inconsistent
nrslib
13
7.6k
NewSQL_ ストレージ分離と分散合意を用いたスケーラブルアーキテクチャ
hacomono
PRO
4
320
Featured
See All Featured
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Documentation Writing (for coders)
carmenintech
77
5.3k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
440
Darren the Foodie - Storyboard
khoart
PRO
3
2.8k
AI: The stuff that nobody shows you
jnunemaker
PRO
3
390
Producing Creativity
orderedlist
PRO
348
40k
The SEO identity crisis: Don't let AI make you average
varn
0
410
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
390
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
140
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
62
51k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
91
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とか....
おしまい