Bug #63699 [Asn->Csd]: Poor date()/etc performance [PATCH]
Edit report at https://bugs.php.net/bug.php?id=63699&edit=1
ID: 63699
Updated by: lstrojny@php.net
Reported by: njaguar at gmail dot com
Summary: Poor date()/etc performance [PATCH]
-Status: Assigned
+Status: Closed
Type: Bug
Package: Performance problem
Operating System: *
PHP Version: 5.4.9
Assigned To: lstrojny
Block user comment: N
Private report: N
New Comment:
The fix for this bug has been committed.
Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
For Windows:
http://windows.php.net/snapshots/
Thank you for the report, and for helping us make PHP better.
Fixed with some modifications in 5.4, 5.5 and master.
Previous Comments:
------------------------------------------------------------------------
[2012-12-05 15:52:47] njaguar at gmail dot com
Description:
------------
More info: http://news.php.net/php.internals/64147
I ended up digging deeper and created a patch for this.
Summary of changes:
- Created a new tz_checked_valid flag on the global date structure
- Created a callback method when date.timezone is modified by the ini (set)
- Callback checks validity if set during runtime, and will error (with line number) accordingly.
This is probably useful for some users that might no otherwise have realized they made a mistake on
their ini_set() line in their code.
- In guess_timezone(), if tz_checked_valid is not set, attempts to validate, errors if cannot.
As previously noted from my benchmarks, over 1 million runs, it increased performance from:
date : 1.751 sec
strftime : 1.872 sec
strtotime : 3.195 sec
to:
date : 1.238 sec
strftime : 0.999 sec
strtotime : 2.337 sec
Here is a test case to show that it will not blow up on invalid timezones, and revalidates
accordingly:
<?php
ini_set('date.timezone', 'FAKE_TIMEZONE');
echo date('F j, Y, g:i a');
ini_set('date.timezone', 'America/Chicago');
echo date('F j, Y, g:i a');
?>
Note: If the ini is actually set wrong, it will not error until they call a date function that makes
use of the timezone, just like before.
Thanks!
Test script:
---------------
$c = 1000000;
for($i=0; $i<$c; $i++) date('F j, Y, g:i a');
etc..
Expected result:
----------------
Performance results are benchmarked and displayed in the general description
Actual result:
--------------
Performance results are benchmarked and displayed in the general description
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=63699&edit=1
Thread (3 messages)