.benchmarks

git-svn-id: svn://ultimatepp.org/upp/trunk@9478 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2016-02-14 05:55:30 +00:00
parent 7af82368b7
commit 656346c390

View file

@ -4,52 +4,6 @@ using namespace Upp;
const int N = 1000000;
// M. D. MCILROY
// Appendix. An adversary for
// qsort
#include <stdlib.h>
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<n; i++) {
ptr[i] = i;
val[i] = gas;
}
qsort(ptr, n, sizeof(*ptr), cmp);
free(ptr);
return ncmp;
}
CONSOLE_APP_MAIN
{
StdLogSetup(LOG_COUT|LOG_FILE);
@ -68,16 +22,33 @@ CONSOLE_APP_MAIN
double t = tm.Seconds();
RLOG(n << " " << t << " s");
}
Buffer<int> aq(N);
RLOG("Generating antiqsort");
antiqsort(N, aq);
Vector<String> 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");
for(int n = 2; n <= 10; n++) {
Vector<String> h;
int r;
for(int i = 0; i < N; i++) {
if(i % n == 0)
r = Random();
h.Add(AsString(r));
}
TimeStop tm;
Sort(h);
double t = tm.Seconds();
RLOG("A " << n << " " << t << " s");
}
for(int n = 2; n <= 10; n++) {
Vector<String> h;
int r = Random();
int n0 = 0;
for(int i = 0; i < N; i++) {
if(i / n != n0) {
r = Random();
n0 = i / n;
}
h.Add(AsString(r));
}
TimeStop tm;
Sort(h);
double t = tm.Seconds();
RLOG("B " << n << " " << t << " s");
}
}