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.4k
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
集中して作業する技術/how_to_work_deeply
hanhan1978
61
40k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
10
9.1k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
3.4k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
4.5k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
1.9k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
12
5.4k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
16
12k
PHP で学ぶ Cache の距離の話 / study_cache_with_php
hanhan1978
7
2.1k
Laravel を低速化する技術 / how to slow laravel
hanhan1978
2
3.9k
Other Decks in Technology
See All in Technology
SNSマーケティングに革新! ABEMA サッカー動画切り出しを生成AIで自動化し、業務効率化を狙う! / abema-ai-marketing
cyberagentdevelopers
PRO
1
120
Amazon_CloudWatch_ログ異常検出_導入ガイド
tsujiba
4
1.8k
コンテナのトラブルシューティング目線から AWS SAW についてしゃべってみる
kazzpapa3
1
120
いまならこう作りたい AWSコンテナ[本格]入門ハンズオン 〜2024年版 ハンズオンの構想〜
horsewin
10
2.2k
"君は見ているが観察していない"で考えるインシデントマネジメント
grimoh
3
270
Datachain会社紹介資料(2024年11月) / Company Deck
datachain
4
17k
Exadata Database Service on Cloud@Customer セキュリティ、ネットワーク、および管理について
oracle4engineer
PRO
0
1.1k
Fargateを使った研修の話
takesection
0
160
신뢰할 수 있는 AI 검색 엔진을 만들기 위한 Liner의 여정
huffon
0
470
Gradle: The Build System That Loves To Hate You
aurimas
2
170
「視座」の上げ方が成人発達理論にわかりやすくまとまってた / think_ perspective_hidden_dimensions
shuzon
2
13k
フルカイテン株式会社 採用資料
fullkaiten
0
39k
Featured
See All Featured
For a Future-Friendly Web
brad_frost
175
9.4k
Agile that works and the tools we love
rasmusluckow
327
21k
KATA
mclloyd
29
13k
Designing for Performance
lara
604
68k
We Have a Design System, Now What?
morganepeng
50
7.2k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.6k
Facilitating Awesome Meetings
lara
49
6.1k
Become a Pro
speakerdeck
PRO
24
5k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
27
4.2k
How GitHub (no longer) Works
holman
310
140k
GraphQLとの向き合い方2022年版
quramy
43
13k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
228
52k
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とか....
おしまい