blob: dc6d7cc05b413aab933964d0c68287a5933099d8 [file] [log] [blame]
#include "SpeedTest.h"
#include "Random.h"
#include <stdio.h> // for printf
#include <memory.h> // for memset
//-----------------------------------------------------------------------------
// 256k blocks seem to give the best results.
void BulkSpeedTest ( pfHash hash, uint32_t seed )
{
Rand r(seed);
const int trials = 9999;
const int blocksize = 256 * 1024;
printf("Bulk speed test - %d-byte keys\n",blocksize);
char * block = new char[blocksize + 16];
r.rand_p(block,blocksize+16);
uint32_t temp[16];
for(int align = 0; align < 8; align++)
{
double bestbpc = 0;
for(int itrial = 0; itrial < trials; itrial++)
{
int64_t begin,end;
begin = rdtsc();
hash(block + align,blocksize,itrial,temp);
end = rdtsc();
blackhole(temp[0]);
double cycles = double(end-begin);
if(cycles > 0)
{
double bpc = double(blocksize) / cycles;
if(bpc > bestbpc) bestbpc = bpc;
}
}
double bestbps = (bestbpc * 3000000000.0 / 1048576.0);
printf("Alignment %2d - %6.3f bytes/cycle - %7.2f MiB/sec @ 3 ghz\n",align,bestbpc,bestbps);
}
delete [] block;
}
//-----------------------------------------------------------------------------
void TinySpeedTest ( pfHash hash, int hashsize, int keysize, uint32_t seed, bool verbose, double & outCycles )
{
const int trials = 100000;
if(verbose) printf("Small key speed test - %4d-byte keys - ",keysize);
Rand r(seed);
uint8_t * h = new uint8_t[hashsize];
uint8_t * k = new uint8_t[keysize];
memset(h,0,hashsize);
memset(k,0,keysize);
double bestcycles = 1e9;
for(int itrial = 0; itrial < trials; itrial++)
{
volatile int64_t begin,end;
rand_p(k,keysize);
MixVCode(h,4);
begin = rdtsc();
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
end = rdtsc();
MixVCode(h,4);
//printf("0x%08x\n",g_verify);
double cycles = double(end-begin) / 64;
if((cycles > 0) && (cycles < bestcycles)) bestcycles = cycles;
}
double bestbpc = double(keysize) / bestcycles;
if(verbose) printf("%8.2f cycles/hash, %8.4f bytes/cycle\n",bestcycles,bestbpc);
outCycles = bestcycles;
}
//-----------------------------------------------------------------------------