8000 Optimise HMGET method · phpredis/phpredis@2434ba2 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2434ba2

Browse files
JakubOnderkamichael-grunder
authored andcommitted
Optimise HMGET method
Allocate output array to expected size and reuse already allocated string for output array keys
1 parent aba0993 commit 2434ba2

File tree

1 file changed

+24
-22
lines changed

1 file changed

+24
-22
lines changed

library.c

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3534,7 +3534,7 @@ redis_mbulk_reply_zipped_raw_variant(RedisSock *redis_sock, zval *zret, int coun
35343534
PHP_REDIS_API int redis_mbulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
35353535
{
35363536
char *response;
3537-
int response_len;
3537+
int response_len, retval;
35383538
int i, numElems;
35393539

35403540
zval *z_keys = ctx;
@@ -3545,44 +3545,46 @@ PHP_REDIS_API int redis_mbulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSoc
35453545
} else {
35463546
add_next_index_bool(z_tab, 0);
35473547
}
3548-
goto failure;
3548+
retval = FAILURE;
3549+
goto end;
35493550
}
3551+
35503552
zval z_multi_result;
3551-
array_init(&z_multi_result); /* pre-allocate array for multi's results. */
3553+
array_init_size(&z_multi_result, numElems); /* pre-allocate array for multi's results. */
35523554

35533555
for(i = 0; i < numElems; ++i) {
3554-
zend_string *zstr = zval_get_string(&z_keys[i]);
3556+
zend_string *tmp_str;
3557+
zend_string *zstr = zval_get_tmp_string(&z_keys[i], &tmp_str);
35553558
response = redis_sock_read(redis_sock, &response_len);
3556-
if(response != NULL) {
3557-
zval z_unpacked;
3558-
if (redis_unpack(redis_sock, response, response_len, &z_unpacked)) {
3559-
add_assoc_zval_ex(&z_multi_result, ZSTR_VAL(zstr), ZSTR_LEN(zstr), &z_unpacked);
3560-
} else {
3561-
add_assoc_stringl_ex(&z_multi_result, ZSTR_VAL(zstr), ZSTR_LEN(zstr), response, response_len);
3559+
zval z_unpacked;
3560+
if (response != NULL) {
3561+
if (!redis_unpack(redis_sock, response, response_len, &z_unpacked)) {
3562+
ZVAL_STRINGL(&z_unpacked, response, response_len);
35623563
}
35633564
efree(response);
35643565
} else {
3565-
add_assoc_bool_ex(&z_multi_result, ZSTR_VAL(zstr), ZSTR_LEN(zstr), 0);
3566+
ZVAL_FALSE(&z_unpacked);
35663567
}
3567-
zend_string_release(zstr);
3568-
zval_dtor(&z_keys[i]);
3568+
zend_symtable_update(Z_ARRVAL(z_multi_result), zstr, &z_unpacked);
3569+
zend_tmp_string_release(tmp_str);
35693570
}
3570-
efree(z_keys);
35713571

35723572
if (IS_ATOMIC(redis_sock)) {
35733573
RETVAL_ZVAL(&z_multi_result, 0, 1);
35743574
} else {
35753575
add_next_index_zval(z_tab, &z_multi_result);
35763576
}
3577-
return SUCCESS;
3578-
failure:
3579-
if (z_keys != NULL) {
3580-
for (i = 0; Z_TYPE(z_keys[i]) != IS_NULL; ++i) {
3581-
zval_dtor(&z_keys[i]);
3582-
}
3583-
efree(z_keys);
3577+
3578+
retval = SUCCESS;
3579+
3580+
end:
3581+
// Cleanup z_keys
3582+
for (i = 0; Z_TYPE(z_keys[i]) != IS_NULL; ++i) {
3583+
zval_dtor(&z_keys[i]);
35843584
}
3585-
return FAILURE;
3585+
efree(z_keys);
3586+
3587+
return retval;
35863588
}
35873589

35883590
/**

0 commit comments

Comments
 (0)
0