|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2005-10-01 16:07 UTC] six at aegis-corp dot org
Description:
------------
performance of the date() function has taken a huge hit between PHP 5.0 and 5.1. i believe this is because of an unneeded syscall when a second argument is given.
Reproduce code:
---------------
<?
for ($a = 0; $a < 100000; $a++) date("Y-m-d H:i:s", $a);
?>
Expected result:
----------------
time /usr/local/bin/php-cli-5.0.4 datetest.php
real 0m2.022s
user 0m1.910s
sys 0m0.000s
Actual result:
--------------
time /usr/local/bin/php-cli-5.1.0RC1 datetest.php
real 0m10.001s
user 0m8.120s
sys 0m0.130s
5.1.0 takes more than 4x the time to complete than 5.0.4
with an strace, I can see that 5.1.0RC1 makes one (probably unneeded) time() syscall per call to date(), which 5.0.4 does not
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Dec 01 23:00:02 2025 UTC |
sniper: the latest cvs exhibits the same problem. rasmus: $_SERVER["REQUEST_TIME"] is a nice addition, but in my case I just want to convert timestamps stored in a db to a readable format, hence no need for the current time at all ... the following patch address the unneeded call to time(NULL), strace confirms it, but the performance is still not on par with 5.0 --- php5-200510011430/ext/date/php_date.c.orig 2005-10-01 18:16:55.000000000 +0200 +++ php5-200510011430/ext/date/php_date.c 2005-10-01 18:17:48.000000000 +0200 @@ -479,11 +479,23 @@ { char *format; int format_len; - time_t ts = time(NULL); + time_t ts; char *string; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &format, &format_len, &ts) == FAILURE) { - RETURN_FALSE; + switch (ZEND_NUM_ARGS()) { + case 2: + if (zend_parse_parameters(2 TSRMLS_CC, "sl", &format, &format_len, &ts) == FAILURE) { + RETURN_FALSE; + } + break; + case 1: + if (zend_parse_parameters(1 TSRMLS_CC, "s", &format, &format_len) == FAILURE) { + RETURN_FALSE; + } + ts = time(NULL); + break; + default: + WRONG_PARAM_COUNT; } string = php_format_date(format, format_len, ts, localtime TSRMLS_CC);