darudaru

だるだるしてるエンジニア

DateTimeImmutableを使ったらどれくらい遅くなるのか

DateTimeImmutableのformat()を頻繁に使っていたら、コードレビューで「速度が気になる」と指摘を受けたので計測してみました。

先に結果

  • やっぱりDateTimeImmutableの関数の使用回数を減らしたほうが速い

計測

DateTimeImmutableのformat()で年月日を毎回取得する方法と、最初にformat()で取得した後に文字分割で年月日を取得する方法の2つで計測を行いました。
処理は1万回実行。

計測用のコード
<?php

$date = new DateTimeImmutable('2017-05-17');

$time_start = microtime(true);

echo "datetimeimmutable\n";
for($i=0; $i < 10000; $i++){
  use_datetimeimmutable($date);
}

$time = microtime(true) - $time_start;
echo "{$time}\n\n";

$time_start = microtime(true);

echo "substr\n";
for($i=0; $i < 10000; $i++){
  use_substr($date);
}

$time = microtime(true) - $time_start;
echo "{$time}\n\n";

function use_datetimeimmutable($date){
  $date->format('Ymd');
  $date->format('Y');
  $date->format('m');
  $date->format('d');
  return $date->format('Ymd');
}

function use_substr($date){
  $ymd = $date->format('Ymd');
  substr($ymd, 0, 4);
  substr($ymd, 4, 2);
  substr($ymd, 6, 2);
  return $ymd;
}

結果

最初に結論を書いたように、DateTimeImmutableの使用頻度を減らしたほうが処理速度は速かったです。知ってた。
平均2倍くらいDateTimeImmutableの処理が遅い結果になりました。

datetimeimmutable
0.041656017303467 秒

substr
0.024217844009399 秒

まとめ

  • DateTimeImmutable を使ったほうが遅いとはいえ、微微たる差。検証で行った文字分割のような処理に無理に切り替える必要はないかなと。
  • ただ、ちりも積もれば、なので、大量のデータを扱う場合はDateTimeImmutableは考えて使ったほうがよいと思う。
  • ちなみにレビューの指摘は、無理しない程度にDateTimeImmutableのformat()の使用頻度を減らす形で落ち着きました。

DateTimeImmutableの使い方は以前まとめたのでご参考までに。
blog.darudaru-life.com