Skip to content

Commit f1bf54a

Browse files
pks-tgitster
authored andcommitted
reftable: allow inlining of a few functions
We have a few functions which are basically just accessors to structures. As those functions are executed inside the hot loop when iterating through many refs, the fact that they cannot be inlined is costing us some performance. Move the function definitions into their respective headers so that they can be inlined. This results in a performance improvement when iterating over 1 million refs: Benchmark 1: show-ref: single matching ref (revision = HEAD~) Time (mean ± σ): 105.9 ms ± 3.6 ms [User: 103.0 ms, System: 2.8 ms] Range (min … max): 103.1 ms … 133.4 ms 1000 runs Benchmark 2: show-ref: single matching ref (revision = HEAD) Time (mean ± σ): 100.7 ms ± 3.4 ms [User: 97.8 ms, System: 2.8 ms] Range (min … max): 97.8 ms … 124.0 ms 1000 runs Summary show-ref: single matching ref (revision = HEAD) ran 1.05 ± 0.05 times faster than show-ref: single matching ref (revision = HEAD~) Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent daf4f43 commit f1bf54a

File tree

4 files changed

+20
-25
lines changed

4 files changed

+20
-25
lines changed

reftable/pq.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,6 @@ int pq_less(struct pq_entry *a, struct pq_entry *b)
2020
return cmp < 0;
2121
}
2222

23-
struct pq_entry merged_iter_pqueue_top(struct merged_iter_pqueue pq)
24-
{
25-
return pq.heap[0];
26-
}
27-
28-
int merged_iter_pqueue_is_empty(struct merged_iter_pqueue pq)
29-
{
30-
return pq.len == 0;
31-
}
32-
3323
struct pq_entry merged_iter_pqueue_remove(struct merged_iter_pqueue *pq)
3424
{
3525
int i = 0;

reftable/pq.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,20 @@ struct merged_iter_pqueue {
2222
size_t cap;
2323
};
2424

25-
struct pq_entry merged_iter_pqueue_top(struct merged_iter_pqueue pq);
26-
int merged_iter_pqueue_is_empty(struct merged_iter_pqueue pq);
2725
void merged_iter_pqueue_check(struct merged_iter_pqueue pq);
2826
struct pq_entry merged_iter_pqueue_remove(struct merged_iter_pqueue *pq);
2927
void merged_iter_pqueue_add(struct merged_iter_pqueue *pq, const struct pq_entry *e);
3028
void merged_iter_pqueue_release(struct merged_iter_pqueue *pq);
3129
int pq_less(struct pq_entry *a, struct pq_entry *b);
3230

31+
static inline struct pq_entry merged_iter_pqueue_top(struct merged_iter_pqueue pq)
32+
{
33+
return pq.heap[0];
34+
}
35+
36+
static inline int merged_iter_pqueue_is_empty(struct merged_iter_pqueue pq)
37+
{
38+
return pq.len == 0;
39+
}
40+
3341
#endif

reftable/record.c

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1176,11 +1176,6 @@ void reftable_record_key(struct reftable_record *rec, struct strbuf *dest)
11761176
reftable_record_vtable(rec)->key(reftable_record_data(rec), dest);
11771177
}
11781178

1179-
uint8_t reftable_record_type(struct reftable_record *rec)
1180-
{
1181-
return rec->type;
1182-
}
1183-
11841179
int reftable_record_encode(struct reftable_record *rec, struct string_view dest,
11851180
int hash_size)
11861181
{
@@ -1302,12 +1297,6 @@ int reftable_log_record_is_deletion(const struct reftable_log_record *log)
13021297
return (log->value_type == REFTABLE_LOG_DELETION);
13031298
}
13041299

1305-
void string_view_consume(struct string_view *s, int n)
1306-
{
1307-
s->buf += n;
1308-
s->len -= n;
1309-
}
1310-
13111300
static void *reftable_record_data(struct reftable_record *rec)
13121301
{
13131302
switch (rec->type) {

reftable/record.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ struct string_view {
2525
};
2626

2727
/* Advance `s.buf` by `n`, and decrease length. */
28-
void string_view_consume(struct string_view *s, int n);
28+
static inline void string_view_consume(struct string_view *s, int n)
29+
{
30+
s->buf += n;
31+
s->len -= n;
32+
}
2933

3034
/* utilities for de/encoding varints */
3135

@@ -127,7 +131,6 @@ int reftable_record_cmp(struct reftable_record *a, struct reftable_record *b);
127131
int reftable_record_equal(struct reftable_record *a, struct reftable_record *b, int hash_size);
128132
void reftable_record_print(struct reftable_record *rec, int hash_size);
129133
void reftable_record_key(struct reftable_record *rec, struct strbuf *dest);
130-
uint8_t reftable_record_type(struct reftable_record *rec);
131134
void reftable_record_copy_from(struct reftable_record *rec,
132135
struct reftable_record *src, int hash_size);
133136
uint8_t reftable_record_val_type(struct reftable_record *rec);
@@ -138,6 +141,11 @@ int reftable_record_decode(struct reftable_record *rec, struct strbuf key,
138141
int hash_size);
139142
int reftable_record_is_deletion(struct reftable_record *rec);
140143

144+
static inline uint8_t reftable_record_type(struct reftable_record *rec)
145+
{
146+
return rec->type;
147+
}
148+
141149
/* frees and zeroes out the embedded record */
142150
void reftable_record_release(struct reftable_record *rec);
143151

0 commit comments

Comments
 (0)