【PHP8.1】new DateTimeZone()が170倍速くなったよ


PHP8.1では、DateTimeZoneのインスタンス生成が少しばかり高速化しました。

$t1 = microtime(true);
for ($i=1; $i<1000000; $i++) {
    $dummy = new \DateTimeZone('Asia/Tokyo');
}
$t2 = microtime(true);

var_dump($t2-$t1);
8.1.0 8.0.13 7.4.9
0.131 8.115 8.498
0.134 8.077 8.502

1000000インスタンス生成に8秒強かかっていたのが0.1秒になりました。

なんだこれ。

timelib performance fix

Dmitry Stogov

へいDerick、https://github.com/derickr/timelib/pull/99のプルリクについて意見を聞かせてくれないか?

この修正でnew DateTimeZone()を170倍改善したよ。
結果、幾つかの現実的なアプリでも目に見える高速化があったよ。
たとえばSymfonyのデモではcallgrindが7%改善した。

この修正は半年以上前に送ったやつなんだけど、PHP8.1に入れてくれたらありがたい。

Derick Rethans

当時のプルリクでは修正必須のステータスだったと思うんだけど、今見てみたらPOSIXの仕様にちゃんと従ってますね。
PHPのmasterに、他のバグフィックスと共にマージしました。

PHP8.1

この修正は6871a49b6609a98e291248b0e89ae9730d9dd580でマージされ、PHP8.1でリリースされました。

感想

この手の単純ループのパフォーマンス計測は性能厨が喜ぶだけで基本的には意味がないものですが、さすがにこれほどの差であれば実アプリで目に見える程度に影響が出てくるようです。

それにしても、ほんの数行の変更だけでこれだけ速度が変わるなんて不思議ですね。
PHPは7以降どんどんソースが整理され、高速化が進んできましたが、PHP8の今になってもこれほどの高速化の余地が残っているとは驚きです。