Bug #63699 [Opn->Asn]: Poor date()/etc performance [PATCH]

From: Date: Wed, 05 Dec 2012 22:51:14 +0000
Subject: Bug #63699 [Opn->Asn]: Poor date()/etc performance [PATCH]
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-175149@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=63699&edit=1

 ID:                 63699
 Updated by:         johannes@php.net
 Reported by:        njaguar at gmail dot com
 Summary:            Poor date()/etc performance [PATCH]
-Status:             Open
+Status:             Assigned
 Type:               Bug
 Package:            Performance problem
 Operating System:   *
 PHP Version:        5.4.9
-Assigned To:        
+Assigned To:        derick
 Block user comment: N
 Private report:     N



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)

« previous php.bugs (#175149) next »