From 783f2e8bdd8502be7ff3965869e3a58d2afe0d08 Mon Sep 17 00:00:00 2001 From: Konstantin Osipov <kostja@tarantool.org> Date: Tue, 3 Sep 2013 13:13:26 +0400 Subject: [PATCH] A go at trying to remove the performance regression in hash primary key access. Inline tuple_field_old(), which avoids a function call for field 0 access. --- src/box/tuple.cc | 36 ------------------------------------ src/box/tuple.h | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/src/box/tuple.cc b/src/box/tuple.cc index e4916d195e..0daec17367 100644 --- a/src/box/tuple.cc +++ b/src/box/tuple.cc @@ -248,42 +248,6 @@ tuple_ref(struct tuple *tuple, int count) tuple_free(tuple); } -/** - * Get a field from tuple. - * - * @pre field < tuple->field_count. - * @returns field data if field exists or NULL - */ -const char * -tuple_field_old(const struct tuple_format *format, - const struct tuple *tuple, uint32_t i) -{ - const char *field = tuple->data; - - if (i == 0) - return field; - i--; - if (i < format->max_fieldno) { - if (format->offset[i] > 0) - return field + format->offset[i]; - if (format->offset[i] != INT32_MIN) { - uint32_t *field_map = (uint32_t *) tuple; - int32_t idx = format->offset[i]; - return field + field_map[idx]; - } - } - const char *tuple_end = field + tuple->bsize; - - while (field < tuple_end) { - uint32_t len = load_varint32(&field); - field += len; - if (i == 0) - return field; - i--; - } - return tuple_end; -} - const char * tuple_seek(struct tuple_iterator *it, uint32_t i, uint32_t *len) { diff --git a/src/box/tuple.h b/src/box/tuple.h index 8ba49b1946..bd893244c2 100644 --- a/src/box/tuple.h +++ b/src/box/tuple.h @@ -176,10 +176,38 @@ tuple_format(const struct tuple *tuple) * Get a field from tuple by index. * Returns a pointer to BER-length prefixed field. * + * @pre field < tuple->field_count. + * @returns field data if field exists or NULL */ -const char * +static inline const char * tuple_field_old(const struct tuple_format *format, - const struct tuple *tuple, uint32_t i); + const struct tuple *tuple, uint32_t i) +{ + const char *field = tuple->data; + + if (i == 0) + return field; + i--; + if (i < format->max_fieldno) { + if (format->offset[i] > 0) + return field + format->offset[i]; + if (format->offset[i] != INT32_MIN) { + uint32_t *field_map = (uint32_t *) tuple; + int32_t idx = format->offset[i]; + return field + field_map[idx]; + } + } + const char *tuple_end = field + tuple->bsize; + + while (field < tuple_end) { + uint32_t len = load_varint32(&field); + field += len; + if (i == 0) + return field; + i--; + } + return tuple_end; +} /** * @brief Return field data of the field -- GitLab