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