Skip to content
Snippets Groups Projects
Commit 783f2e8b authored by Konstantin Osipov's avatar Konstantin Osipov
Browse files

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.
parent 03b53bf6
No related branches found
No related tags found
No related merge requests found
......@@ -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)
{
......
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment