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
PCREとPCRE-JITとPHP / pcre-pcre-jit-and-php
Search
Ryo Tomidokoro
May 29, 2019
Technology
1
2.4k
PCREとPCRE-JITとPHP / pcre-pcre-jit-and-php
PHPのPCREについて、基本的なこと
Ryo Tomidokoro
May 29, 2019
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.3k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
3.3k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
4
1.3k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
12
4.7k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
14
11k
Laravel Collectionの計算量を調べてみた2023/laravel_collection_time_complexity_2023
hanhan1978
0
860
PHP で学ぶ Cache の距離の話 / study_cache_with_php
hanhan1978
7
1.8k
Laravel を低速化する技術 / how to slow laravel
hanhan1978
1
3k
俺の Laravel がこんなに速いわけがない! / My Laravel Too Fast
hanhan1978
0
1.6k
Other Decks in Technology
See All in Technology
私が trocco を推す理由
__allllllllez__
1
200
チームでロジカルシンキングに改めて向き合っている話 〜学習環境と実践⽅法〜
sansantech
PRO
2
1.5k
長期間TiDBを使ってきた話 @ 私たちはなぜNewSQLを使うのかTiDB選定5社が語る選定理由と活用LT / Experiences with TiDB Over Time
chibiegg
2
870
GraphQL 成熟度モデルの紹介と、プロダクトに当てはめた事例 / GraphQL maturity model
mh4gf
7
1.3k
Hands-on Gemini, the Google DeepMind LLM
meteatamel
1
110
Vertex AI を中心に 生成AIのアップデートを共有します
kaz1437
0
290
推しは推せるときに推せ! プロダクトにフィードバックしていこう
nakasho
0
280
MySQL の SQL クエリチューニングの要所を掴む勉強会
andpad
2
6k
KubeCon EU 2024 Recap “Kubernetes Policy Time Machine: Where to Next?”
ryysud
0
200
JSON攻略法.pdf
miyakemito
8
4.8k
本当のAWS基礎
toru_kubota
0
490
現代CSSフレームワークの内部実装とその仕組み
poteboy
8
3.5k
Featured
See All Featured
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
352
28k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
7
990
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
104
6.6k
Rebuilding a faster, lazier Slack
samanthasiow
73
8.2k
Bash Introduction
62gerente
604
210k
GraphQLの誤解/rethinking-graphql
sonatard
50
9.2k
GraphQLとの向き合い方2022年版
quramy
32
12k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
241
1.2M
Debugging Ruby Performance
tmm1
70
11k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
116
18k
The Pragmatic Product Professional
lauravandoore
25
5.8k
Thoughts on Productivity
jonyablonski
58
3.8k
Transcript
PCREとPCRE-JITとPHPの話 Ryo Tomidokoro PHP Study 2019/05/29 @hanhan1978
そもそも何の話か?
preg_… の関数群 [引用] PHP PCRE - Manual https://www.php.net/manual/en/book.pcre.php
正規表現を使っている例
preg系関数群の正規表現の処理で使われている ライブラリ(PCRE)について、特に運用時に気に なる設定とか、パフォーマンスに関係する部分 について話します。 ※書き方とか文法の話はしません。
PCREとは?
Perl Compatible Regular Expression Perl互換正規表現
と言われても、ピンと来ない人が多いと思うの で、とても簡単な正規表現の説明 ※詳しくは英語版wikipediaを読むと分かりやすい。日本語でも大体OK
50's - 形式言語の研究過程でスティーヴン・クリーネが文 字群の数学的表記を記述 60's - ケン・トンプソンがQEDエディタに文字列のパター ンマッチ方法として導入 その後 -
edエディタや、grepへ同様機能が実装され、正規 表現として認知されていった。 ざっくりとした歴史
Basic Regular Expression 正規表現の種類 Extended Regular Expression GNU Emacs Regular
Expression sed, awk, grep の正規表現 | + ? などの表現が追加 PHPではereg_系の関数で使われる正規表現 (現在は非推奨) \w \b などの特殊文字列表現が使える
正規表現の種類 Perl Compatible Regular Expression Lazy match (非欲張り量指定子)などの強力で柔 軟な表現力が加わった 正規表現におけるデファクトスタンダードのよう
な存在
非欲張り量指定子 Non GreedyとかLazyとか言われる <span>hoge</span> 正規表現は基本欲張 <.+> <span>hoge</span> 非欲張り量指定子なら <.+?> <span>hoge</span>
で、PCREとは?
Perl互換正規表現ライブラリのnative実装。 独自のAPIとPOSIX準拠のAPIの両方がある。 BSDライセンスで公開されていて、様々な言語に 取り入れられている。
[引用] https://www.pcre.org/
PCRE-JITとは?
Just In Time Compiler 正規表現のパターンマッチの速度を上げる目的で導入され た正規表現のJITコンパイラ 通常の正規表現実行前に、JIT最適化を行うためCPUに余分 な負荷をかけるが、正規表現マッチングのパフォーマンス が上がる。
正規表現ライブラリのベンチマーク [引用] 正規表現技術入門 - 新屋良磨、鈴木勇介、高田謙 技術評論社 (p99)
正規表現の最適化を行う分、プロセッサに余計 な負荷をかけるが、正規表現のパターンマッチ 実行時間を大幅に軽減できる。 特殊な理由が無い限りPCRE-JITの利用が望まし い。
PHPとPCRE
PCREとPCRE-JITの歴史 1997-9-10 ver 0.91 -> PCREのもっとも古いchangelogの日付 . . . 2011-10-21
ver 8.20 -> PCRE-JITがリリース 2015-1-05 ver 10.00 -> PCRE2がリリース このリリース以降、PCREはバグフィックスのみ。 PCRE-JITもPCRE2-JITとバージョンに合わせた名前に変更 ※重要 PCRE2-JITにおいて、APIに若干の変更がある [引用] https://www.pcre.org/original/changelog.txt
PHPとPCRE-JITの歴史 PCREはPHP4系から存在していたようなので馴れ初めは割愛 [2015-12-03] PHP7のリリース、pcre.jit=1 がデフォルト設定に。 [2017-11-30] PHP7.2 Support for PCRE
JIT Fast Path -> pcre_jit_exec [2018-12-06] PHP7.3のリリース PCREからPCRE2にライブラリが変更 [引用] https://www.php.net/releases/
PHPとPCREの関係 PHPのソースコード内に丸っとPCREのソースコードが同梱さ れている。
PHP7.2系
PHP7.3系
実際にベンチマークしてみる
PHP7以降はpcre.jitが有効
pcre.jit最強? 実行時間を考えるとpcre.jitを有効化すべきだが、場合に よっては有効化できない場合がある。 PHP5系において、コンパイル後の正規表現の実行スタック サイズが64Kを超えてしまう場合、pcre.jitでエラーが発生 する。PREG_JIT_STACKLIMIT_ERROR
PREG_JIT_STACKLIMIT_ERRORの解決策として pcre.jit を0に設定するという対策があるがオススメ はしない。 先程みたとおり、jitコンパイラで最適化された正規表 現はとにかく速い。
JIT無効でベンチマークしてみる
pcre2の性能差で7.3系はjit無効化しても多少性能が良い
pcre.jitを無効化する場合は、その代償をよく 考えた上で無効化すること せめてPHP7.3系に上げることで、JIT無効化環境 でもPHP5系よりも速いパフォーマンスを手に入 れることは可能。
ところで
64Kを突破したくないですか?
JITのStack Sizeはmin 32K [引用] https://www.pcre.org/original/doc/html/pcrejit.html
もう少しよく読むと...
最大値は任意に指定できる [引用] https://www.pcre.org/original/doc/html/pcrejit.html
PCRE2も同様
Stackサイズ表 PHPバージョン PCRE-JITスタックサイズ 7.0系 32K ~ 64K 7.1系 32K ~
64K 7.2系 32K ~ 64K 7.3系 32K ~ 192K 7.3系で PCRE_JIT_STACK_MAX_SIZE が変更になっていた
エラー内容とその対応 注)良い子は真似しちゃ駄目な対応が含まれます。
1. PHP7.3系にあげてみる 2. 複雑な正規表現を改善する 3. スタックサイズを上げる ext/pcre/php_pcre.c #define PCRE_JIT_STACK_MAX_SIZE (192
* 1024) を書き換えてコンパイル PREG_JIT_STACKLIMIT_ERROR
1. PCREのコンパイルオプションを変える ext/pcre/pcre2lib/config.h #define LINK_SIZE 2 これを4とかにする。64K -> 128K までコンパイル済み正
規表現のサイズが上がる。 Compilation failed: regular expression is too large
まとめ PHP7.3系からPCRE2に変更 PHP7.3系はStackサイズがちょっと大きい pcre.jit=0はパフォーマンスが悪い 最終手段は再コンパイル!