Skip to content

Commit 98ac10b

Browse files
committed
mprove performance by embedding and rearranging structs
1 parent 4ce16ac commit 98ac10b

File tree

4 files changed

+20
-34
lines changed

4 files changed

+20
-34
lines changed

msgpack.c

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -157,16 +157,12 @@ PS_SERIALIZER_DECODE_FUNC(msgpack) /* {{{ */ {
157157
zend_string *key_str;
158158
zval tmp, *value;
159159
msgpack_unpack_t mp;
160-
msgpack_unserialize_data_t var_hash;
161160
size_t off = 0;
162161

163162
template_init(&mp);
164163

165-
msgpack_unserialize_var_init(&var_hash);
166-
167164
ZVAL_UNDEF(&tmp);
168165
mp.user.retval = &tmp;
169-
mp.user.var_hash = &var_hash;
170166
mp.user.eof = val + vallen;
171167

172168
ret = template_execute(&mp, val, vallen, &off);
@@ -175,7 +171,7 @@ PS_SERIALIZER_DECODE_FUNC(msgpack) /* {{{ */ {
175171
}
176172

177173
if (ret == MSGPACK_UNPACK_EXTRA_BYTES || ret == MSGPACK_UNPACK_SUCCESS) {
178-
msgpack_unserialize_var_destroy(&var_hash, 0);
174+
msgpack_unserialize_var_destroy(&mp.user.var_hash, 0);
179175

180176
switch(Z_TYPE_P(mp.user.retval)) {
181177
case IS_ARRAY:
@@ -192,7 +188,7 @@ PS_SERIALIZER_DECODE_FUNC(msgpack) /* {{{ */ {
192188

193189
zval_ptr_dtor(&tmp);
194190
} else {
195-
msgpack_unserialize_var_destroy(&var_hash, 1);
191+
msgpack_unserialize_var_destroy(&mp.user.var_hash, 1);
196192
}
197193

198194
return SUCCESS;
@@ -214,7 +210,6 @@ PHP_MSGPACK_API int php_msgpack_unserialize(zval *return_value, char *str, size_
214210
int ret;
215211
size_t off = 0;
216212
msgpack_unpack_t mp;
217-
msgpack_unserialize_data_t var_hash;
218213

219214
if (str_len <= 0) {
220215
RETVAL_NULL();
@@ -223,10 +218,7 @@ PHP_MSGPACK_API int php_msgpack_unserialize(zval *return_value, char *str, size_
223218

224219
template_init(&mp);
225220

226-
msgpack_unserialize_var_init(&var_hash);
227-
228221
mp.user.retval = return_value;
229-
mp.user.var_hash = &var_hash;
230222
mp.user.eof = str + str_len;
231223

232224
ret = template_execute(&mp, str, (size_t)str_len, &off);
@@ -243,7 +235,7 @@ PHP_MSGPACK_API int php_msgpack_unserialize(zval *return_value, char *str, size_
243235
break;
244236
case MSGPACK_UNPACK_EXTRA_BYTES:
245237
case MSGPACK_UNPACK_SUCCESS:
246-
msgpack_unserialize_var_destroy(&var_hash, 0);
238+
msgpack_unserialize_var_destroy(&mp.user.var_hash, 0);
247239
if (off < str_len) {
248240
MSGPACK_WARNING("[msgpack] (%s) Extra bytes", __FUNCTION__);
249241
}
@@ -252,7 +244,7 @@ PHP_MSGPACK_API int php_msgpack_unserialize(zval *return_value, char *str, size_
252244
MSGPACK_WARNING("[msgpack] (%s) Unknown result", __FUNCTION__);
253245
}
254246
zval_dtor(return_value);
255-
msgpack_unserialize_var_destroy(&var_hash, 1);
247+
msgpack_unserialize_var_destroy(&mp.user.var_hash, 1);
256248
RETVAL_FALSE;
257249
return FAILURE;
258250
}

msgpack_class.c

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ typedef struct {
1717
zval retval;
1818
long offset;
1919
msgpack_unpack_t mp;
20-
msgpack_unserialize_data_t var_hash;
2120
long php_only;
2221
zend_bool finished;
2322
int error;
@@ -300,17 +299,15 @@ static ZEND_METHOD(msgpack_unpacker, __construct) /* {{{ */ {
300299

301300
template_init(&unpacker->mp);
302301

303-
msgpack_unserialize_var_init(&unpacker->var_hash);
304-
305-
(&unpacker->mp)->user.var_hash = &unpacker->var_hash;
302+
msgpack_unserialize_var_init(&unpacker->mp.user.var_hash);
306303
}
307304
/* }}} */
308305

309306
static ZEND_METHOD(msgpack_unpacker, __destruct) /* {{{ */ {
310307
php_msgpack_unpacker_t *unpacker = Z_MSGPACK_UNPACKER_P(getThis());
311308
smart_str_free(&unpacker->buffer);
312309
zval_ptr_dtor(&unpacker->retval);
313-
msgpack_unserialize_var_destroy(&unpacker->var_hash, unpacker->error);
310+
msgpack_unserialize_var_destroy(&unpacker->mp.user.var_hash, unpacker->error);
314311
}
315312
/* }}} */
316313

@@ -387,14 +384,12 @@ static ZEND_METHOD(msgpack_unpacker, execute) /* {{{ */ {
387384
}
388385

389386
if (unpacker->finished) {
390-
msgpack_unserialize_var_destroy(&unpacker->var_hash, unpacker->error);
387+
msgpack_unserialize_var_destroy(&unpacker->mp.user.var_hash, unpacker->error);
391388
unpacker->error = 0;
392389

393390
template_init(&unpacker->mp);
394391

395-
msgpack_unserialize_var_init(&unpacker->var_hash);
396-
397-
(&unpacker->mp)->user.var_hash = &unpacker->var_hash;
392+
msgpack_unserialize_var_init(&unpacker->mp.user.var_hash);
398393
}
399394
(&unpacker->mp)->user.retval = &unpacker->retval;
400395
(&unpacker->mp)->user.eof = data + len;
@@ -480,14 +475,12 @@ static ZEND_METHOD(msgpack_unpacker, reset) /* {{{ */ {
480475

481476
smart_str_free(&buffer);
482477

483-
msgpack_unserialize_var_destroy(&unpacker->var_hash, unpacker->error);
478+
msgpack_unserialize_var_destroy(&unpacker->mp.user.var_hash, unpacker->error);
484479
unpacker->error = 0;
485480

486481
template_init(&unpacker->mp);
487482

488-
msgpack_unserialize_var_init(&unpacker->var_hash);
489-
490-
(&unpacker->mp)->user.var_hash = &unpacker->var_hash;
483+
msgpack_unserialize_var_init(&unpacker->mp.user.var_hash);
491484
}
492485
/* }}} */
493486

msgpack_unpack.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,23 @@
1414
#endif
1515

1616
typedef struct {
17-
zval data[VAR_ENTRIES_MAX];
1817
zend_long used_slots;
1918
void *next;
19+
zval data[VAR_ENTRIES_MAX];
2020
} var_entries;
2121

2222
#define MSGPACK_UNSERIALIZE_ALLOC_STACK(_unpack) \
2323
if (UNEXPECTED(_unpack->deps == 0)) { \
2424
*obj = _unpack->retval; \
2525
} else { \
26-
*obj = msgpack_stack_push(_unpack->var_hash); \
26+
*obj = msgpack_stack_push(&_unpack->var_hash); \
2727
}
2828

2929
#define MSGPACK_UNSERIALIZE_ALLOC_VALUE(_unpack) \
3030
if (UNEXPECTED(_unpack->deps <= 0)) { \
3131
*obj = _unpack->retval; \
3232
} else { \
33-
*obj = msgpack_var_push(_unpack->var_hash); \
33+
*obj = msgpack_var_push(&_unpack->var_hash); \
3434
}
3535

3636
#define MSGPACK_UNSERIALIZE_DEC_DEP(_unpack) \
@@ -41,10 +41,10 @@ typedef struct {
4141

4242
#define MSGPACK_UNSERIALIZE_FINISH_ITEM(_unpack, _v1, _v2) \
4343
if ((_v2) && MSGPACK_IS_STACK_VALUE((_v2))) { \
44-
msgpack_stack_pop(_unpack->var_hash, (_v2)); \
44+
msgpack_stack_pop(&_unpack->var_hash, (_v2)); \
4545
} \
4646
if ((_v1) && MSGPACK_IS_STACK_VALUE((_v1))) { \
47-
msgpack_stack_pop(_unpack->var_hash, (_v1)); \
47+
msgpack_stack_pop(&_unpack->var_hash, (_v1)); \
4848
} \
4949
MSGPACK_UNSERIALIZE_DEC_DEP(_unpack);
5050

@@ -327,6 +327,7 @@ void msgpack_unserialize_var_destroy(msgpack_unserialize_data_t *var_hashx, zend
327327
void msgpack_unserialize_init(msgpack_unserialize_data *unpack) /* {{{ */ {
328328
unpack->deps = 0;
329329
unpack->type = MSGPACK_SERIALIZE_TYPE_NONE;
330+
msgpack_unserialize_var_init(&unpack->var_hash);
330331
}
331332
/* }}} */
332333

@@ -598,7 +599,7 @@ int msgpack_unserialize_map_item(msgpack_unserialize_data *unpack, zval **contai
598599
int type = unpack->type;
599600

600601
unpack->type = MSGPACK_SERIALIZE_TYPE_NONE;
601-
if ((rval = msgpack_var_access(unpack->var_hash, Z_LVAL_P(val) - 1)) == NULL) {
602+
if ((rval = msgpack_var_access(&unpack->var_hash, Z_LVAL_P(val) - 1)) == NULL) {
602603
if (UNEXPECTED(Z_LVAL_P(val) == 1 /* access the retval */)) {
603604
rval = unpack->retval;
604605
} else {
@@ -745,13 +746,13 @@ int msgpack_unserialize_map_item(msgpack_unserialize_data *unpack, zval **contai
745746
}
746747

747748
if (MSGPACK_IS_STACK_VALUE(val)) {
748-
msgpack_stack_pop(unpack->var_hash, val);
749+
msgpack_stack_pop(&unpack->var_hash, val);
749750
} else {
750751
msgpack_var_replace(val, nval);
751752
}
752753
if (MSGPACK_IS_STACK_VALUE(key)) {
753754
/* just in case for malformed data */
754-
msgpack_stack_pop(unpack->var_hash, key);
755+
msgpack_stack_pop(&unpack->var_hash, key);
755756
}
756757

757758
deps = unpack->deps - 1;

msgpack_unpack.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ typedef struct _msgpack_unserialize_data {
2828
typedef struct {
2929
zval *retval;
3030
const char *eof;
31-
msgpack_unserialize_data_t *var_hash;
3231
int type;
3332
unsigned int count;
3433
long deps;
3534
long stack[MSGPACK_EMBED_STACK_SIZE];
35+
msgpack_unserialize_data_t var_hash;
3636
} msgpack_unserialize_data;
3737

3838
void msgpack_unserialize_var_init(msgpack_unserialize_data_t *var_hashx);

0 commit comments

Comments
 (0)