blob: 16e183db49f48bc36292ce1d0e6fe783a9521e8e [file] [log] [blame]
tanjent@gmail.comad4b3632010-11-05 01:20:58 +00001#include "SpeedTest.h"
2
3#include "Random.h"
4
5#include <stdio.h> // for printf
tanjent@gmail.comad4b3632010-11-05 01:20:58 +00006
7//-----------------------------------------------------------------------------
8// 256k blocks seem to give the best results.
9
10void BulkSpeedTest ( pfHash hash )
11{
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000012 const int trials = 9999;
13 const int blocksize = 256 * 1024;
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000014
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000015 printf("Bulk speed test - %d-byte keys\n",blocksize);
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000016
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000017 char * block = new char[blocksize + 16];
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000018
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000019 rand_p(block,blocksize+16);
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000020
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000021 uint32_t temp[16];
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000022
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000023 for(int align = 0; align < 8; align++)
24 {
25 double bestbpc = 0;
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000026
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000027 for(int itrial = 0; itrial < trials; itrial++)
28 {
29 int64_t begin,end;
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000030
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000031 begin = rdtsc();
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000032
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000033 hash(block + align,blocksize,itrial,temp);
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000034
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000035 end = rdtsc();
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000036
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000037 blackhole(temp[0]);
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000038
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000039 double cycles = double(end-begin);
tanjent@gmail.comb379f342011-03-20 03:18:20 +000040 if(cycles > 0)
41 {
42 double bpc = double(blocksize) / cycles;
43 if(bpc > bestbpc) bestbpc = bpc;
44 }
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000045 }
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000046
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000047 double bestbps = (bestbpc * 3000000000.0 / 1048576.0);
48 printf("Alignment %2d - %6.3f bytes/cycle - %7.2f MiB/sec @ 3 ghz\n",align,bestbpc,bestbps);
49 }
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000050
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000051 delete [] block;
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000052}
tanjent@gmail.combabb5532011-02-28 06:03:12 +000053
54//-----------------------------------------------------------------------------
55
56void TinySpeedTest ( pfHash hash, int hashsize, int keysize, bool verbose, double & outCycles )
57{
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000058 const int trials = 100000;
tanjent@gmail.combabb5532011-02-28 06:03:12 +000059
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000060 if(verbose) printf("Small key speed test - %4d-byte keys - ",keysize);
tanjent@gmail.combabb5532011-02-28 06:03:12 +000061
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000062 uint8_t * h = new uint8_t[hashsize];
63 uint8_t * k = new uint8_t[keysize];
tanjent@gmail.combabb5532011-02-28 06:03:12 +000064
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000065 double bestcycles = 1e9;
tanjent@gmail.combabb5532011-02-28 06:03:12 +000066
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000067 for(int itrial = 0; itrial < trials; itrial++)
68 {
69 int64_t begin,end;
tanjent@gmail.combabb5532011-02-28 06:03:12 +000070
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000071 rand_p(k,keysize);
tanjent@gmail.combabb5532011-02-28 06:03:12 +000072
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000073 begin = rdtsc();
74
75 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
76 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
77 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
78 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
tanjent@gmail.combabb5532011-02-28 06:03:12 +000079
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000080 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
81 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
82 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
83 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
tanjent@gmail.combabb5532011-02-28 06:03:12 +000084
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000085 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
86 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
87 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
88 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
tanjent@gmail.combabb5532011-02-28 06:03:12 +000089
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000090 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
91 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
92 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
93 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
tanjent@gmail.combabb5532011-02-28 06:03:12 +000094
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000095 end = rdtsc();
tanjent@gmail.combabb5532011-02-28 06:03:12 +000096
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000097 //blackhole(*(uint32_t*)(&h));
tanjent@gmail.combabb5532011-02-28 06:03:12 +000098
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +000099 double cycles = double(end-begin) / 64;
tanjent@gmail.comb379f342011-03-20 03:18:20 +0000100 if((cycles > 0) && (cycles < bestcycles)) bestcycles = cycles;
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +0000101 }
tanjent@gmail.combabb5532011-02-28 06:03:12 +0000102
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +0000103 double bestbpc = double(keysize) / bestcycles;
104 if(verbose) printf("%8.2f cycles/hash, %8.4f bytes/cycle\n",bestcycles,bestbpc);
tanjent@gmail.combabb5532011-02-28 06:03:12 +0000105
tanjent@gmail.com6ffe0102011-03-19 21:28:26 +0000106 outCycles = bestcycles;
tanjent@gmail.combabb5532011-02-28 06:03:12 +0000107}
108
109//-----------------------------------------------------------------------------