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のための計算量入門/Complexity101 for PHPer
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Ryo Tomidokoro
December 22, 2024
Technology
3.6k
8
Share
PHPerのための計算量入門/Complexity101 for PHPer
PHPカンファレンス2024の登壇資料です。
Ryo Tomidokoro
December 22, 2024
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
あるアーキテクチャ決定と その結果/architecture-decision-and-its-result
hanhan1978
0
160
開発者が知っておきたい複雑さの正体/where-the-complexity-comes-from
hanhan1978
8
3.5k
Spec Driven Development入門/spec_driven_development_for_learners
hanhan1978
2
1.8k
フロントエンドが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
260
集中して作業する技術/how_to_work_deeply
hanhan1978
65
56k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
11k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
4.9k
Other Decks in Technology
See All in Technology
Network Firewall Proxyで 自前プロキシを消し去ることができるのか
gusandayo
0
180
AIを活用したアクセシビリティ改善フロー
degudegu2510
1
130
推し活エージェント
yuntan_t
1
780
互換性のある(らしい)DBへの移行など考えるにあたってたいへんざっくり
sejima
PRO
0
540
GitHub Actions侵害 — 相次ぐ事例を振り返り、次なる脅威に備える
flatt_security
13
7.5k
「できない」のアウトプット 同人誌『精神を壊してからの』シリーズ出版を 通して得られたこと
comi190327
3
560
マルチモーダル非構造データとの闘い
shibuiwilliam
1
180
ハーネスエンジニアリング×AI適応開発
aictokamiya
3
1.4k
20260326_AIDD事例紹介_ULSC.pdf
findy_eventslides
0
500
15年メンテしてきたdotfilesから開発トレンドを振り返る 2011 - 2026
giginet
PRO
2
270
TanStack Start エコシステムの現在地 / TanStack Start Ecosystem 2026
iktakahiro
1
260
Why we keep our community?
kawaguti
PRO
1
430
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
27
3.4k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Ethics towards AI in product and experience design
skipperchong
2
250
Game over? The fight for quality and originality in the time of robots
wayneb77
1
160
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
120
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.4k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
61
43k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
490
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
200
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
140
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
410
How to make the Groovebox
asonas
2
2.1k
Transcript
PHPerのための計算量入門 PHPカンファレンス 2024/12/22 @hanhan1978
@hanhan1978 名前 富所 亮 所属 株式会社カオナビ CTO室 BackEnd Re-architecturing Team
(BERT) Blog https://blog.hanhans.net Podcast https://podcasters.spotify.com/pod/show/yokohama-north-am 2
本トークの背景 社内ISUCONの解説で「計算量」という言葉が全く伝わらなかったので もっとわかりやすせねば!!!と決意
計算量とは?
その前に...
計算とは?
計算 [参照] アーキテクチャ: コンピュータの仕組み https://www.gsic.titech.ac.jp/matsuda/l/CS/arch/index.htm
PHPにおける計算 [参照] PHP の関数実行とその計測(記事版)https://qiita.com/sj-i/items/836fa5a5e246961c40b6
PHPにおける計算 [参照] PHP の関数実行とその計測(記事版)https://qiita.com/sj-i/items/836fa5a5e246961c40b6 ZendVM による Opcode の実行
PHPにおける計算 普段われわれが書いているPHPのソースコードも 最終的にはOpCode配列に変換され実行される
計算量とは?
コード例1 1から引数$nまでの数を足し算する関数
コード例1 ループの中で n回の足し算を計算する
コード例1 Opcode Opcode Dump (最適化後)
コード例1 Opcode Jump命令を使ったn回計算
余談 - Opcodeの出力方法 PHP 7.x 以降であれば php-cli で出力できる
余談 - Opcodeの出力方法 $ docker run -it -v `pwd`:/hoge php:8.4-cli
bash # docker-php-ext-install opcache # cd hoge # php -d opcache.enable_cli=1 \ -d opcache.opt_debug_level=0x20000 \ sample.php 10 docker 最高!
コード例2 1から引数$nまでの足し算を公式を使って計算
コード例2 nの数に依らず1行の計算
コード例2 Opcode Opcode Dump (最適化後)
コード例2 Opcode nの数によらず6行の計算
O記法 (Big-O notation) オーダー記法【ランダウの記号】O記法 IT用語辞典 e-Words https://e-words.jp/w/オーダー記法.html
O記法 (Big-O notation) 計算量の目安を表す便利な記法。 O記法での表現によって、そのアルゴリズムがどんな 時間計算量特性を持つのかを理解できる。 O(1), O(n), O(n^2), O(n*log
n) 括弧の中身が計算量のオーダーを表す
データ量と時間計算量特性の関係 [引用] 開発新卒に捧ぐ、基本のアルゴリズムと計算量 https://www.techscore.com/
コード例1 引数nに対してn回の計算 ▶ O(n)
コード例2 Nの数に依らず一定数の計算 ▶ O(1)
実測してみよう!
データ量に対する計算時間の比較
2つの計算量 時間計算量(Time Complexity) プログラムの計算の回数 空間計算量(Space Complexity) プログラムが利用するメモリ使用量
時間計算量 先程のコード例1, 2 は時間計算量比較 O(n) O(1)
空間計算量 メモリが枯渇する可能性がある
空間計算量 Bookの個数が増えると共にメモリ使用量が増える
空間計算量をチェックするには? https://www.php.net/manual/ja/function.memory-get-usage.php
空間計算量をチェックするには? https://www.php.net/manual/ja/function.memory-get-peak-usage.php
もう少し現実的なコード例から 計算量を理解してみよう
例題 とあるウェブサービスを運営する会社の社員が会員 データの分析をするためのCSVファイルを作ります。 全ユーザのデータをDatabaseから取得して、各種付帯 情報を追加してCSVファイルを作成します。
コード例(CSVファイル作成)
コードの問題は何? 仕様は満たしている、動作も問題ない ▶ しかし、データの増大と共に問題を起こす可能性がある。 負荷試験を行って、データ量と処理時間の関係を確認する。
データ件数と処理時間の関係
データ件数と処理時間の関係 計算量は O(n^2) と推定
この問題をどのように検出する? なるべく勘や経験に頼りたくはない。 何か良い方法はあるだろうか?
◎負荷試験 本番相当以上のデータ量を用意した負荷試験を行 えば、確実に検出することが可能 ただし、コアドメインじゃない限り負荷試験はコ ストがかかるので行われない…
×静的解析 PHPStan, PHPMD等は検出する対象の問題が 異なる 流石に無理...
▲経験 好きなアプローチではない 現状もっとも低コストで現実的に実行できる対策 はこれになってしまう。 研修や教育によって計算量に対して、意識を向け てもらうようにする。 今、まさにやってるコレ
◯継続的なメトリクスの確認 Mackerel, New Relic, Datadog アラートで早めに気付ければOK
時間計算量の数え方 (練習)
単純な掛け算関数
単純な掛け算関数
単純な掛け算関数 O(n)
計算量視点でコード例を改善しよう
コード例(CSVファイル作成)
コード例(CSVファイル作成)
コード例(CSVファイル作成) O(n^2)
計算量オーダーを下げる
改善例 in_array ▶ array_key_exists ※事前に $purchased_users のid, key を入れ替えておく
改善例 計算量オーダーが下がった!
処理時間を再計測
データ件数と処理時間の関係(改善後)
データ件数と処理時間の関係(改善後)
しかし、常に改善すれば良いわけではない
計算量警察 計算量視点を手に入れたエンジニアは どんな関数でも計算量を改善しようとする...
ここでデータ量と計算量オーダーの関係を 思い出そう
データ量と時間計算量特性の関係 [引用] 開発新卒に捧ぐ、基本のアルゴリズムと計算量 https://www.techscore.com/ データ量が少ない場合 どんなアルゴリズムでも計算量は少ない
良い指摘の仕方 このプログラムが処理するデータ量は3万件で す。アルゴリズムの計算量がO(N^2)なので、処理 時間に懸念があります。 ▶ 計算量を指摘する場合は想定データ量とセット!
よく使う処理の計算量
アルゴリズムと計算量 アルゴリズム 計算量 バブルソート O(n^2) マージソート O(n * log n)
バイナリーサーチ O(log n) 基本情報処理技術者試験!
配列操作関数の計算量 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 配列計算はPHPの華...
Laravel Collection 文字が小さくてゴメン
Redis
仕様変更も視野に入れる
複雑な要件を放置しない
チューニングには限界がある ビジネス要件が複雑すぎる場合... いくらアルゴリズムを調整したところで 計算量を減らす限界がある プログラムのことだけを考えても改善できない
チューニングには限界がある ビジネス要件が複雑すぎる場合... いくらアルゴリズムを調整したところで 計算量を減らす限界がある プログラムのことだけを考えても改善できない 視野を広く!
まとめ
まとめ 1. 「計算」を理解する 2. 「計算量」を理解する 3. よく使う関数の「計算量」を把握する 4. 仕様変更も視野に入れる
まとめ 1. 「計算」を理解する 2. 「計算量」を理解する 3. よく使う関数の「計算量」を把握する 4. 仕様変更も視野に入れる
まとめ 1. 「計算」を理解する 2. 「計算量」を理解する 3. よく使う処理の「計算量」を把握する 4. 仕様変更も視野に入れる
まとめ 1. 「計算」を理解する 2. 「計算量」を理解する 3. よく使う処理の「計算量」を把握する 4. 仕様変更も視野に入れる
参考書籍
数学ガール 乱択アルゴリズム 結城 浩 (2011) SoftBank Creative 第10章 乱択アルゴリズム 物語調で
理解しやすい
みんなのコンピューターサイエンス Wladston Ferreira Filho 著、小山 裕司 翻訳 (2019) 翔泳社 2.
計算量 一番簡潔
アルゴリズムと計算量 野崎昭弘 著 (1987) 共立出版 第一章 アルゴリズムと計算量 ちょっと難しい