[php-src] master: ext/standard: Optimize pack() by avoiding redundant padding in pack() string formats (#24133)
| From: | Weilin Du via GitHub | Date: | Mon, 05 Oct 2026 12:03:46 +0000 |
| Subject: | [php-src] master: ext/standard: Optimize pack() by avoiding redundant padding in pack() string formats (#24133) | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-141959@lists.php.net to get a copy of this message | ||
Author: Weilin Du (LamentXU123)
Committer: GitHub (web-flow)
Pusher: LamentXU123
Date: 2026-10-05T20:03:43+08:00
Commit: https://github.com/php/php-src/commit/8ca3fe5148da03464d9c5302e5acbc351b95667c
Raw diff: https://github.com/php/php-src/commit/8ca3fe5148da03464d9c5302e5acbc351b95667c.diff
ext/standard: Optimize pack() by avoiding redundant padding in pack() string formats (#24133)
Changed paths:
M UPGRADING
M ext/standard/pack.c
Diff:
diff --git a/UPGRADING b/UPGRADING
index a6cdf9829ab1..9ef58ba60078 100644
--- a/UPGRADING
+++ b/UPGRADING
@@ -99,6 +99,8 @@ PHP 8.7 UPGRADE NOTES
. Improved performance of array_splice() when inserting without removing
elements.
. Improved performance of str_rot13().
+ . Improved performance of pack() for large strings using the a, A and Z
+ formats.
- MBString:
. Improved performance of mb_strlen for UTF-8 strings.
diff --git a/ext/standard/pack.c b/ext/standard/pack.c
index 1da93228f71f..c8cbf8613f63 100644
--- a/ext/standard/pack.c
+++ b/ext/standard/pack.c
@@ -559,9 +559,12 @@ PHP_FUNCTION(pack)
zend_string *tmp_str;
zend_string *str = zval_get_tmp_string(&argv[currentarg++], &tmp_str);
- memset(&ZSTR_VAL(output)[outputpos], (code == 'a' || code == 'Z') ?
'\0' : ' ', arg);
- memcpy(&ZSTR_VAL(output)[outputpos], ZSTR_VAL(str),
- (ZSTR_LEN(str) < arg_cp) ? ZSTR_LEN(str) : arg_cp);
+ arg_cp = MIN(ZSTR_LEN(str), arg_cp);
+ if (arg_cp < arg) {
+ memset(&ZSTR_VAL(output)[outputpos + arg_cp],
+ (code == 'a' || code == 'Z') ? '\0' : ' ', arg -
arg_cp);
+ }
+ memcpy(&ZSTR_VAL(output)[outputpos], ZSTR_VAL(str), arg_cp);
outputpos += arg;
zend_tmp_string_release(tmp_str);