test-mergesort: use DEFINE_LIST_SORT

Build a typed sort function for the mergesort performance test tool
using DEFINE_LIST_SORT instead of calling llist_mergesort().  This gets
rid of the next pointer accessor functions and improves the performance
at the cost of a slightly higher object text size.

Before:
0071.12: llist_mergesort() unsorted    0.24(0.22+0.01)
0071.14: llist_mergesort() sorted      0.12(0.10+0.01)
0071.16: llist_mergesort() reversed    0.12(0.10+0.01)

__TEXT	__DATA	__OBJC	others	dec	hex
6407	276	0	24701	31384	7a98	t/helper/test-mergesort.o

With this patch:
0071.12: DEFINE_LIST_SORT unsorted     0.22(0.21+0.01)
0071.14: DEFINE_LIST_SORT sorted       0.11(0.10+0.01)
0071.16: DEFINE_LIST_SORT reversed     0.11(0.10+0.01)

__TEXT	__DATA	__OBJC	others	dec	hex
6615	276	0	25832	32723	7fd3	t/helper/test-mergesort.o

Signed-off-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
René Scharfe 2022-07-16 18:57:18 +02:00 committed by Junio C Hamano
parent f00a039839
commit b378c2ff1e
2 changed files with 5 additions and 14 deletions

View File

@ -13,19 +13,10 @@ struct line {
struct line *next;
};
static void *get_next(const void *a)
{
return ((const struct line *)a)->next;
}
DEFINE_LIST_SORT(static, sort_lines, struct line, next);
static void set_next(void *a, void *b)
static int compare_strings(const struct line *x, const struct line *y)
{
((struct line *)a)->next = b;
}
static int compare_strings(const void *a, const void *b)
{
const struct line *x = a, *y = b;
return strcmp(x->text, y->text);
}
@ -47,7 +38,7 @@ static int sort_stdin(void)
p = line;
}
lines = llist_mergesort(lines, get_next, set_next, compare_strings);
sort_lines(&lines, compare_strings);
while (lines) {
puts(lines->text);

View File

@ -40,11 +40,11 @@ done
for file in unsorted sorted reversed
do
test_perf "llist_mergesort() $file" "
test_perf "DEFINE_LIST_SORT $file" "
test-tool mergesort sort <$file >actual
"
test_expect_success "llist_mergesort() $file sorts like sort(1)" "
test_expect_success "DEFINE_LIST_SORT $file sorts like sort(1)" "
test_cmp_bin sorted actual
"
done