diff --git a/benchmarks/Sort2/Sort2.cpp b/benchmarks/Sort2/Sort2.cpp new file mode 100644 index 000000000..d5b9b71d8 --- /dev/null +++ b/benchmarks/Sort2/Sort2.cpp @@ -0,0 +1,83 @@ +#include + +using namespace Upp; + +const int N = 1000000; + +// M. D. MCILROY +// Appendix. An adversary for +// qsort + +#include + +int *val; /* item values */ +int ncmp; /* number of comparisons */ +int nsolid; /* number of solid items */ +int candidate; /* pivot candidate */ +int gas; /* gas value */ + +#define freeze(x) val[x] = nsolid++ +int cmp(const void *px, const void *py) /* per C standard */ +{ + const int x = *(const int*)px; + const int y = *(const int*)py; + ncmp++; + if(val[x]==gas && val[y]==gas) + if(x == candidate) + freeze(x); + else + freeze(y); + if(val[x] == gas) + candidate = x; + else if(val[y] == gas) + candidate = y; + return val[x] - val[y]; /* only the sign matters */ +} + +int antiqsort(int n, int *a) +{ + int i; + int *ptr = (int *)malloc(n*sizeof(*ptr)); + val = a; + gas = n - 1; + nsolid = ncmp = candidate = 0; + for(i=0; i h; + for(int i = 0; i < N; i++) + if(n < 0) + h.Add(AsString(N - i)); + else + if(n) + h.Add(AsString(Random(n))); + else + h.Add(AsString(Random())); + TimeStop tm; + Sort(h); + double t = tm.Seconds(); + RLOG(n << " " << t << " s"); + } + + Buffer aq(N); + RLOG("Generating antiqsort"); + antiqsort(N, aq); + Vector h; + for(int i = 0; i < N; i++) + h.Add(AsString(aq[i])); + RLOG("Now sorting"); + TimeStop tm; + Sort(h); + double t = tm.Seconds(); + RLOG("antiqsort " << t << " s"); +} diff --git a/benchmarks/Sort2/Sort2.upp b/benchmarks/Sort2/Sort2.upp new file mode 100644 index 000000000..5cb92eed3 --- /dev/null +++ b/benchmarks/Sort2/Sort2.upp @@ -0,0 +1,11 @@ +description "Benchmarking ugly sort cases\377"; + +uses + Core; + +file + Sort2.cpp; + +mainconfig + "" = ""; + diff --git a/benchmarks/Sort2/init b/benchmarks/Sort2/init new file mode 100644 index 000000000..b429a1ff2 --- /dev/null +++ b/benchmarks/Sort2/init @@ -0,0 +1,4 @@ +#ifndef _Sort2_icpp_init_stub +#define _Sort2_icpp_init_stub +#include "Core/init" +#endif