From 885cad2ec4fc4f37594d52dc3646e8a6ddcc118e Mon Sep 17 00:00:00 2001 From: David Carlier Date: Mon, 21 Apr 2025 14:44:18 +0100 Subject: [PATCH 1/2] ext/date: various array optimisations. pre-allocated sizes and/or packed arrays. --- ext/date/php_date.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 99b0fc3c952c0..d2904c33c472b 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1408,7 +1408,7 @@ PHP_FUNCTION(localtime) ts->zone_type = TIMELIB_ZONETYPE_ID; timelib_unixtime2local(ts, (timelib_sll) timestamp); - array_init(return_value); + array_init_size(return_value, 9); if (associative) { add_assoc_long(return_value, "tm_sec", ts->s); @@ -1421,6 +1421,7 @@ PHP_FUNCTION(localtime) add_assoc_long(return_value, "tm_yday", timelib_day_of_year(ts->y, ts->m, ts->d)); add_assoc_long(return_value, "tm_isdst", ts->dst); } else { + zend_hash_real_init_packed(Z_ARRVAL_P(return_value)); add_next_index_long(return_value, ts->s); add_next_index_long(return_value, ts->i); add_next_index_long(return_value, ts->h); @@ -1462,7 +1463,7 @@ PHP_FUNCTION(getdate) ts->zone_type = TIMELIB_ZONETYPE_ID; timelib_unixtime2local(ts, (timelib_sll) timestamp); - array_init(return_value); + array_init_size(return_value, 11); add_assoc_long(return_value, "seconds", ts->s); add_assoc_long(return_value, "minutes", ts->i); @@ -3059,14 +3060,16 @@ static void zval_from_error_container(zval *z, const timelib_error_container *er zval element; add_assoc_long(z, "warning_count", error->warning_count); - array_init(&element); + array_init_size(&element, error->warning_count); + zend_hash_real_init_packed(Z_ARRVAL(element)); for (i = 0; i < error->warning_count; i++) { add_index_string(&element, error->warning_messages[i].position, error->warning_messages[i].message); } add_assoc_zval(z, "warnings", &element); add_assoc_long(z, "error_count", error->error_count); - array_init(&element); + array_init_size(&element, error->error_count); + zend_hash_real_init_packed(Z_ARRVAL(element)); for (i = 0; i < error->error_count; i++) { add_index_string(&element, error->error_messages[i].position, error->error_messages[i].message); } @@ -4275,7 +4278,7 @@ PHP_FUNCTION(timezone_transitions_get) } #define add_nominal() \ - array_init(&element); \ + array_init_size(&element, 5); \ add_assoc_long(&element, "ts", timestamp_begin); \ add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, timestamp_begin, 0)); \ add_assoc_long(&element, "offset", tzobj->tzi.tz->type[0].offset); \ @@ -4284,7 +4287,7 @@ PHP_FUNCTION(timezone_transitions_get) add_next_index_zval(return_value, &element); #define add(i,ts) \ - array_init(&element); \ + array_init_size(&element, 5); \ add_assoc_long(&element, "ts", ts); \ add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, ts, 0)); \ add_assoc_long(&element, "offset", tzobj->tzi.tz->type[tzobj->tzi.tz->trans_idx[i]].offset); \ @@ -4293,7 +4296,7 @@ PHP_FUNCTION(timezone_transitions_get) add_next_index_zval(return_value, &element); #define add_by_index(i,ts) \ - array_init(&element); \ + array_init_size(&element, 5); \ add_assoc_long(&element, "ts", ts); \ add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, ts, 0)); \ add_assoc_long(&element, "offset", tzobj->tzi.tz->type[i].offset); \ @@ -4302,7 +4305,7 @@ PHP_FUNCTION(timezone_transitions_get) add_next_index_zval(return_value, &element); #define add_from_tto(to,ts) \ - array_init(&element); \ + array_init_size(&element, 5); \ add_assoc_long(&element, "ts", ts); \ add_assoc_str(&element, "time", php_format_date(DATE_FORMAT_ISO8601_LARGE_YEAR, 13, ts, 0)); \ add_assoc_long(&element, "offset", (to)->offset); \ @@ -5336,6 +5339,7 @@ PHP_FUNCTION(timezone_identifiers_list) table = timelib_timezone_identifiers_list((timelib_tzdb*) tzdb, &item_count); array_init(return_value); + zend_hash_real_init_packed(Z_ARRVAL_P(return_value)); for (i = 0; i < item_count; ++i) { if (what == PHP_DATE_TIMEZONE_PER_COUNTRY) { From 91b6c972d57c2a657190c6826213daa5525772ae Mon Sep 17 00:00:00 2001 From: David Carlier Date: Mon, 21 Apr 2025 17:06:30 +0100 Subject: [PATCH 2/2] remove packed optims for errors, can contain holes. --- ext/date/php_date.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/ext/date/php_date.c b/ext/date/php_date.c index d2904c33c472b..c33119cf1bd58 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -3061,7 +3061,6 @@ static void zval_from_error_container(zval *z, const timelib_error_container *er add_assoc_long(z, "warning_count", error->warning_count); array_init_size(&element, error->warning_count); - zend_hash_real_init_packed(Z_ARRVAL(element)); for (i = 0; i < error->warning_count; i++) { add_index_string(&element, error->warning_messages[i].position, error->warning_messages[i].message); } @@ -3069,7 +3068,6 @@ static void zval_from_error_container(zval *z, const timelib_error_container *er add_assoc_long(z, "error_count", error->error_count); array_init_size(&element, error->error_count); - zend_hash_real_init_packed(Z_ARRVAL(element)); for (i = 0; i < error->error_count; i++) { add_index_string(&element, error->error_messages[i].position, error->error_messages[i].message); }