22
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PHPAdvent Calendar 2021

Day 6

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

Posted at

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の今になってもこれほどの高速化の余地が残っているとは驚きです。

22
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?