mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-05-23 05:42:29 +00:00
Add more sorting algorithms
This commit is contained in:
parent
b7bf052a4b
commit
7c9ef924bf
17 changed files with 49004 additions and 5 deletions
|
@ -21,9 +21,11 @@
|
|||
#include "libc/mem/mem.h"
|
||||
#include "libc/runtime/runtime.h"
|
||||
#include "libc/stdio/rand.h"
|
||||
#include "libc/stdio/stdio.h"
|
||||
#include "libc/str/str.h"
|
||||
#include "libc/testlib/ezbench.h"
|
||||
#include "libc/testlib/testlib.h"
|
||||
#include "third_party/vqsort/vqsort.h"
|
||||
|
||||
int CompareLong(const void *a, const void *b) {
|
||||
const long *x = a;
|
||||
|
@ -44,13 +46,88 @@ TEST(_longsort, test) {
|
|||
ASSERT_EQ(0, memcmp(b, a, n * sizeof(long)));
|
||||
}
|
||||
|
||||
TEST(vqsort_int64_avx2, test) {
|
||||
if (!X86_HAVE(AVX2)) return;
|
||||
size_t n = 5000;
|
||||
long *a = gc(calloc(n, sizeof(long)));
|
||||
long *b = gc(calloc(n, sizeof(long)));
|
||||
rngset(a, n * sizeof(long), 0, 0);
|
||||
memcpy(b, a, n * sizeof(long));
|
||||
qsort(a, n, sizeof(long), CompareLong);
|
||||
vqsort_int64_avx2(b, n);
|
||||
ASSERT_EQ(0, memcmp(b, a, n * sizeof(long)));
|
||||
}
|
||||
|
||||
TEST(vqsort_int64_sse4, test) {
|
||||
if (!X86_HAVE(SSE4_2)) return;
|
||||
size_t n = 5000;
|
||||
long *a = gc(calloc(n, sizeof(long)));
|
||||
long *b = gc(calloc(n, sizeof(long)));
|
||||
rngset(a, n * sizeof(long), 0, 0);
|
||||
memcpy(b, a, n * sizeof(long));
|
||||
qsort(a, n, sizeof(long), CompareLong);
|
||||
vqsort_int64_sse4(b, n);
|
||||
ASSERT_EQ(0, memcmp(b, a, n * sizeof(long)));
|
||||
}
|
||||
|
||||
TEST(vqsort_int64_ssse3, test) {
|
||||
if (!X86_HAVE(SSSE3)) return;
|
||||
size_t n = 5000;
|
||||
long *a = gc(calloc(n, sizeof(long)));
|
||||
long *b = gc(calloc(n, sizeof(long)));
|
||||
rngset(a, n * sizeof(long), 0, 0);
|
||||
memcpy(b, a, n * sizeof(long));
|
||||
qsort(a, n, sizeof(long), CompareLong);
|
||||
vqsort_int64_ssse3(b, n);
|
||||
ASSERT_EQ(0, memcmp(b, a, n * sizeof(long)));
|
||||
}
|
||||
|
||||
TEST(vqsort_int64_sse2, test) {
|
||||
size_t n = 5000;
|
||||
long *a = gc(calloc(n, sizeof(long)));
|
||||
long *b = gc(calloc(n, sizeof(long)));
|
||||
rngset(a, n * sizeof(long), 0, 0);
|
||||
memcpy(b, a, n * sizeof(long));
|
||||
qsort(a, n, sizeof(long), CompareLong);
|
||||
vqsort_int64_sse2(b, n);
|
||||
ASSERT_EQ(0, memcmp(b, a, n * sizeof(long)));
|
||||
}
|
||||
|
||||
TEST(radix_sort_int64, test) {
|
||||
size_t n = 5000;
|
||||
long *a = gc(calloc(n, sizeof(long)));
|
||||
long *b = gc(calloc(n, sizeof(long)));
|
||||
rngset(a, n * sizeof(long), 0, 0);
|
||||
memcpy(b, a, n * sizeof(long));
|
||||
qsort(a, n, sizeof(long), CompareLong);
|
||||
radix_sort_int64(b, n);
|
||||
ASSERT_EQ(0, memcmp(b, a, n * sizeof(long)));
|
||||
}
|
||||
|
||||
BENCH(_longsort, bench) {
|
||||
size_t n = 1000;
|
||||
printf("\n");
|
||||
size_t n = 5000;
|
||||
long *p1 = gc(malloc(n * sizeof(long)));
|
||||
long *p2 = gc(malloc(n * sizeof(long)));
|
||||
rngset(p1, n * sizeof(long), 0, 0);
|
||||
EZBENCH2("_longsort", memcpy(p2, p1, n * sizeof(long)), _longsort(p2, n));
|
||||
EZBENCH2("qsort", memcpy(p2, p1, n * sizeof(long)),
|
||||
if (X86_HAVE(AVX2)) {
|
||||
EZBENCH2("vqsort_int64_avx2", memcpy(p2, p1, n * sizeof(long)),
|
||||
vqsort_int64_avx2(p2, n));
|
||||
}
|
||||
if (X86_HAVE(SSE4_2)) {
|
||||
EZBENCH2("vqsort_int64_sse4", memcpy(p2, p1, n * sizeof(long)),
|
||||
vqsort_int64_sse4(p2, n));
|
||||
}
|
||||
if (X86_HAVE(SSSE3)) {
|
||||
EZBENCH2("vqsort_int64_ssse3", memcpy(p2, p1, n * sizeof(long)),
|
||||
vqsort_int64_ssse3(p2, n));
|
||||
}
|
||||
EZBENCH2("vqsort_int64_sse2", memcpy(p2, p1, n * sizeof(long)),
|
||||
vqsort_int64_sse2(p2, n));
|
||||
EZBENCH2("radix_sort_int64", memcpy(p2, p1, n * sizeof(long)),
|
||||
radix_sort_int64(p2, n));
|
||||
EZBENCH2("qsort(long)", memcpy(p2, p1, n * sizeof(long)),
|
||||
qsort(p2, n, sizeof(long), CompareLong));
|
||||
}
|
||||
|
||||
|
@ -73,12 +150,88 @@ TEST(_intsort, test) {
|
|||
ASSERT_EQ(0, memcmp(b, a, n * sizeof(int)));
|
||||
}
|
||||
|
||||
TEST(vqsort_int32_avx2, test) {
|
||||
if (!X86_HAVE(AVX2)) return;
|
||||
size_t n = 5000;
|
||||
int *a = gc(calloc(n, sizeof(int)));
|
||||
int *b = gc(calloc(n, sizeof(int)));
|
||||
rngset(a, n * sizeof(int), 0, 0);
|
||||
memcpy(b, a, n * sizeof(int));
|
||||
qsort(a, n, sizeof(int), CompareInt);
|
||||
vqsort_int32_avx2(b, n);
|
||||
ASSERT_EQ(0, memcmp(b, a, n * sizeof(int)));
|
||||
}
|
||||
|
||||
TEST(vqsort_int32_sse4, test) {
|
||||
if (!X86_HAVE(SSE4_2)) return;
|
||||
size_t n = 5000;
|
||||
int *a = gc(calloc(n, sizeof(int)));
|
||||
int *b = gc(calloc(n, sizeof(int)));
|
||||
rngset(a, n * sizeof(int), 0, 0);
|
||||
memcpy(b, a, n * sizeof(int));
|
||||
qsort(a, n, sizeof(int), CompareInt);
|
||||
vqsort_int32_sse4(b, n);
|
||||
ASSERT_EQ(0, memcmp(b, a, n * sizeof(int)));
|
||||
}
|
||||
|
||||
TEST(vqsort_int32_ssse3, test) {
|
||||
if (!X86_HAVE(SSSE3)) return;
|
||||
size_t n = 5000;
|
||||
int *a = gc(calloc(n, sizeof(int)));
|
||||
int *b = gc(calloc(n, sizeof(int)));
|
||||
rngset(a, n * sizeof(int), 0, 0);
|
||||
memcpy(b, a, n * sizeof(int));
|
||||
qsort(a, n, sizeof(int), CompareInt);
|
||||
vqsort_int32_ssse3(b, n);
|
||||
ASSERT_EQ(0, memcmp(b, a, n * sizeof(int)));
|
||||
}
|
||||
|
||||
TEST(vqsort_int32_sse2, test) {
|
||||
size_t n = 5000;
|
||||
int *a = gc(calloc(n, sizeof(int)));
|
||||
int *b = gc(calloc(n, sizeof(int)));
|
||||
rngset(a, n * sizeof(int), 0, 0);
|
||||
memcpy(b, a, n * sizeof(int));
|
||||
qsort(a, n, sizeof(int), CompareInt);
|
||||
vqsort_int32_sse2(b, n);
|
||||
ASSERT_EQ(0, memcmp(b, a, n * sizeof(int)));
|
||||
}
|
||||
|
||||
TEST(radix_sort_int32, test) {
|
||||
size_t n = 5000;
|
||||
int *a = gc(calloc(n, sizeof(int)));
|
||||
int *b = gc(calloc(n, sizeof(int)));
|
||||
rngset(a, n * sizeof(int), 0, 0);
|
||||
memcpy(b, a, n * sizeof(int));
|
||||
qsort(a, n, sizeof(int), CompareInt);
|
||||
radix_sort_int32(b, n);
|
||||
ASSERT_EQ(0, memcmp(b, a, n * sizeof(int)));
|
||||
}
|
||||
|
||||
BENCH(_intsort, bench) {
|
||||
size_t n = 1000;
|
||||
printf("\n");
|
||||
size_t n = 10000;
|
||||
int *p1 = gc(malloc(n * sizeof(int)));
|
||||
int *p2 = gc(malloc(n * sizeof(int)));
|
||||
rngset(p1, n * sizeof(int), 0, 0);
|
||||
EZBENCH2("_intsort", memcpy(p2, p1, n * sizeof(int)), _intsort(p2, n));
|
||||
EZBENCH2("qsort", memcpy(p2, p1, n * sizeof(int)),
|
||||
if (X86_HAVE(AVX2)) {
|
||||
EZBENCH2("vqsort_int32_avx2", memcpy(p2, p1, n * sizeof(int)),
|
||||
vqsort_int32_avx2(p2, n));
|
||||
}
|
||||
if (X86_HAVE(SSE4_2)) {
|
||||
EZBENCH2("vqsort_int32_sse4", memcpy(p2, p1, n * sizeof(int)),
|
||||
vqsort_int32_sse4(p2, n));
|
||||
}
|
||||
if (X86_HAVE(SSSE3)) {
|
||||
EZBENCH2("vqsort_int32_ssse3", memcpy(p2, p1, n * sizeof(int)),
|
||||
vqsort_int32_ssse3(p2, n));
|
||||
}
|
||||
EZBENCH2("vqsort_int32_sse2", memcpy(p2, p1, n * sizeof(int)),
|
||||
vqsort_int32_sse2(p2, n));
|
||||
EZBENCH2("djbsort", memcpy(p2, p1, n * sizeof(int)), djbsort(p2, n));
|
||||
EZBENCH2("radix_sort_int32", memcpy(p2, p1, n * sizeof(int)),
|
||||
radix_sort_int32(p2, n));
|
||||
EZBENCH2("qsort(int)", memcpy(p2, p1, n * sizeof(int)),
|
||||
qsort(p2, n, sizeof(int), CompareInt));
|
||||
}
|
||||
|
|
|
@ -51,7 +51,8 @@ TEST_LIBC_STR_DIRECTDEPS = \
|
|||
THIRD_PARTY_REGEX \
|
||||
THIRD_PARTY_ZLIB \
|
||||
THIRD_PARTY_LIBCXX \
|
||||
THIRD_PARTY_SMALLZ4
|
||||
THIRD_PARTY_SMALLZ4 \
|
||||
THIRD_PARTY_VQSORT
|
||||
|
||||
TEST_LIBC_STR_DEPS := \
|
||||
$(call uniq,$(foreach x,$(TEST_LIBC_STR_DIRECTDEPS),$($(x))))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue