Have you noticed that date()
function works 2x faster than usual if you set actual timezone inside your script before any date()
call? I'm very curious about this.
Look at this simple piece of code:
<?php
$start = microtime(true);
for ($i = 0; $i < 100000; $i++) date('Y-m-d H:i:s');
echo (microtime(true) - $start);
?>
It just calls date()
function using for
loop 100,000 times. The result I’ve got is always around 1.6 seconds (Windows, PHP 5.3.5) but…
If I set same time zone again adding one absurd line before start:
date_default_timezone_set(date_default_timezone_get());
I get a time below 800ms; ~2x faster (same server).
I was looking around to find any reasonable explanation for this behavior but did not have any success. From my angle, this additional line is useless but PHP doesn’t agree with me.
I have tried this test on two linux servers (different PHP versions) and got different resulting times but in proportion ~6:1.
Note: date.timezone property in php.ini has been properly set (Europe/Paris).
I was searching for related questions here and did not find anything similar. I've also checked manual for date_default_time_zone() function @ php.net and found that I'm not only one who noticed this, but still can't understand why that happens?
Anyone?
Update for PHP 5.4:
As documented in the description of
date_default_timezone_get
, starting from PHP 5.4.0 the algorithm to guess the timezone from system information has been removed from the code (contrast with the PHP 5.3 source) so this behavior no longer exists.Running the timing test on my dev server to see it in action, I got:
Original answer:
I 've just looked into PHP source. Specifically, all relevant code is in
/ext/date/php_date.c
.I started with the assumption that if you don't provide a timezone for
date
,date_default_timezone_get
is called to get one. Here's that function:OK, so what does
get_timezone_info
look like? This:What about
guess_timezone
? Here it is:OK, so how does that interact with
date_default_timezone_set
? Let's look at that function:Long story short: if you call
date_default_timezone_set
once, thenguess_timezone
takes the fast path of reading from thetimezone
variable (the very first conditional is satisfied, and it returns immediately). Otherwise it takes some time to work out the default timezone, which is not cached (I guess for simplicity), and if you do that in a loop the delay starts to show.I'd imagine it has to determine the timezone for itself each time it's called unless explicitly specified, which adds to the function runtime.
But really, does it matter? How many scripts are you likely to make that call date() 100,000 times per run?