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
PHPerのための計算量入門 / Basic Knowledge of Time Comple...
Search
Ryo Tomidokoro
March 30, 2019
Technology
4
5.3k
PHPerのための計算量入門 / Basic Knowledge of Time Complexity
Time Complexity 101 for PHPer
Ryo Tomidokoro
March 30, 2019
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
集中して作業する技術/how_to_work_deeply
hanhan1978
61
41k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
10
9.4k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
3.6k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
4.7k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
12
5.5k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
16
12k
Laravel Collectionの計算量を調べてみた2023/laravel_collection_time_complexity_2023
hanhan1978
1
1.4k
PHP で学ぶ Cache の距離の話 / study_cache_with_php
hanhan1978
7
2.2k
Other Decks in Technology
See All in Technology
ガバメントクラウドのセキュリティ対策事例について
fujisawaryohei
0
530
社内イベント管理システムを1週間でAKSからACAに移行した話し
shingo_kawahara
0
180
AIのコンプラは何故しんどい?
shujisado
1
190
Snykで始めるセキュリティ担当者とSREと開発者が楽になる脆弱性対応 / Getting started with Snyk Vulnerability Response
yamaguchitk333
2
180
kargoの魅力について伝える
magisystem0408
0
200
re:Invent をおうちで楽しんでみた ~CloudWatch のオブザーバビリティ機能がスゴい!/ Enjoyed AWS re:Invent from Home and CloudWatch Observability Feature is Amazing!
yuj1osm
0
120
AWS re:Invent 2024 ふりかえり
kongmingstrap
0
130
Storage Browser for Amazon S3
miu_crescent
1
140
Snowflake女子会#3 Snowpipeの良さを5分で語るよ
lana2548
0
230
podman_update_2024-12
orimanabu
1
260
フロントエンド設計にモブ設計を導入してみた / 20241212_cloudsign_TechFrontMeetup
bengo4com
0
1.9k
終了の危機にあった15年続くWebサービスを全力で存続させる - phpcon2024
yositosi
0
280
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Gamification - CAS2011
davidbonilla
80
5.1k
The Cost Of JavaScript in 2023
addyosmani
45
7k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
28
900
A better future with KSS
kneath
238
17k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Navigating Team Friction
lara
183
15k
Typedesign – Prime Four
hannesfritz
40
2.4k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Statistics for Hackers
jakevdp
796
220k
Product Roadmaps are Hard
iamctodd
PRO
49
11k
Transcript
PHPerのための計算量入門 Ryo Tomidokoro PHPerKaigi 2019/3/30 @hanhan1978
よくあるコード例から 計算量を理解してみよう
例題 とあるウェブサービスを運営する会社の営業社員が会員 データの分析をするためのCSVファイルを作ります。 全ユーザのデータをDatabaseから取得して、各種付帯情 報を追加してCSVファイルを作成します。
コード例
コードの問題は何? 仕様は満たしている、動作も問題ない。しかし、データ の増大と共に問題を起こす可能性がある。 実際に、サンプルコードの負荷試験をして、データ量と 処理時間の関係を確認する。
データ件数と処理時間の関係
データ件数と処理時間の関係
この問題をどのように検出する? なるべく勘や経験に頼りたくはないが、何か良い方法は あるだろうか?
問題を検出する方法
◎負荷試験 人材や納期、品質向上への理解があるのであれば、本番 相当以上のデータ量を用意した負荷試験を行えば、確実に 検出することが可能 今までのエンジニア人生で、CIに負荷試験が組み込まれ ているのを見たことは稀…
静的解析 PHPStan, PHPMD等、試してみたが流石に計算量の問題点 は検出できない。
▲経験 好きなアプローチではないが、現状もっとも低コストで 現実的に実行できる対策はこれになってしまう。研修や教 育によって計算量に対して、意識を向けてもらうようにす る。
計算量視点を持つ いつものコーディングに、新しい視点として、計算量を 加えて見よう。
計算量とは?
2つの計算量 時間計算量(Time Complexity) プログラムの演算の回数 空間計算量(Space Complexity) プログラムが利用するメモリ使用量
時間計算量の測り方
単純な掛け算関数
単純な掛け算関数
単純な掛け算関数
すべてのアルゴリズムで厳密な時間計算量を 算出するのは大変です。 そこで、時間計算量の世界には便利な記法が あります。
O記法 (Big-O notation) 計算量の目安を表す便利な記法。O記法での表現によっ て、そのアルゴリズムがどんな時間計算量特性を持つのか を理解できる。 O(1), O(n), O(n^2), O(n*log
n) 括弧の中身が計算量のオーダーを表す
データ量と時間計算量特性の関係 [引用] 開発新卒に捧ぐ、基本のアルゴリズムと計算量 https://www.techscore.com/
アルゴリズムと計算量 アルゴリズム 計算量 バブルソート O(n^2) マージソート O(n * log n)
バイナリーサーチ O(log n)
計算量視点で最初の例を読み返す
コード例
コード例
コード例
計算量オーダーを下げる
改善例 ※ $purchased_usersのkeyとvalueを入れ替えておく
改善例
改善例
処理時間を再計測
データ件数と処理時間の関係(改善後)
データ件数と処理時間の関係(改善後)
計算量という視点を持つことで、プログラム が潜在的にもつ問題点を見つけることが出来 た。 ※ただし、データ量が少なければ問題ないこ とが多いので、無闇に計算量ばかり指摘するの はやめましょう。
in_arrayは遅いので、array_key_existsに書き換えて! 悪い指摘の仕方
このプログラムが処理するデータ量が3万件です。アル ゴリズムの計算量がO(N^2)なので、処理時間に懸念があり ます。念の為、負荷試験を追加で行ってもらって良いで しょうか? 良い指摘の仕方
おまけ
配列操作関数の計算量 O(1) O(n) O(n^2) array_key_exists array_key_first array_key_last array_push array_pop array_combine
array_flip array_keys array_map array_rand array_shift array_sum array_unique array_values arsort asort in_array array + array range array_fill array_intersect array_merge
Redisのドキュメント
参考図書 数学ガール4 乱択アルゴリズム (結城 浩) みんなのコンピューターサイエンス (Wladston Ferreira Filho) アルゴリズムとデータ構造 (近藤
嘉雪)
Thanks!! @hanhan1978 https://blog.hanhans.net Ryo Tomidokoro