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.8k
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
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
9
13k
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
14k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
180
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
3k
集中して作業する技術/how_to_work_deeply
hanhan1978
65
50k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
10k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
4.3k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
5.4k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2.4k
Other Decks in Technology
See All in Technology
Goss: Faiss向けの新しい本番環境対応 Goバインディング #coefl_go_jp
bengo4com
0
1.4k
実践アプリケーション設計 ②トランザクションスクリプトへの対応
recruitengineers
PRO
4
520
自社製CMSからmicroCMSへのリプレースがプロダクトグロースを加速させた話
nextbeatdev
0
150
DuckDB-Wasmを使って ブラウザ上でRDBMSを動かす
hacusk
1
110
実践データベース設計 ①データベース設計概論
recruitengineers
PRO
4
510
R-SCoRe: Revisiting Scene Coordinate Regression for Robust Large-Scale Visual Localization
takmin
0
430
AIドリブンのソフトウェア開発 - うまいやり方とまずいやり方
okdt
PRO
9
650
LLM時代の検索とコンテキストエンジニアリング
shibuiwilliam
2
1.2k
アジャイルテストで高品質のスプリントレビューを
takesection
0
120
そのコンポーネント、サーバー?クライアント?App Router開発のモヤモヤを可視化する補助輪
makotot
4
630
MySQL HeatWave:サービス概要のご紹介
oracle4engineer
PRO
4
1.7k
あなたの知らない OneDrive
murachiakira
0
240
Featured
See All Featured
Faster Mobile Websites
deanohume
309
31k
How to Ace a Technical Interview
jacobian
279
23k
Building Applications with DynamoDB
mza
96
6.6k
Designing for Performance
lara
610
69k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
The Cult of Friendly URLs
andyhume
79
6.5k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3k
RailsConf 2023
tenderlove
30
1.2k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
YesSQL, Process and Tooling at Scale
rocio
173
14k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
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