blob: c7c742b9e0dc436c7921bf6eafb7a958a7770c1a [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{
12 const int trials = 9999;
13 const int blocksize = 256 * 1024;
14
15 printf("Bulk speed test - %d-byte keys\n",blocksize);
16
17 char * block = new char[blocksize + 16];
18
19 rand_p(block,blocksize+16);
20
21 uint32_t temp[16];
22
23 for(int align = 0; align < 8; align++)
24 {
25 double bestbpc = 0;
26
27 for(int itrial = 0; itrial < trials; itrial++)
28 {
tanjent@gmail.com2aa29c32011-03-19 08:53:53 +000029 int64_t begin,end;
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000030
tanjent@gmail.com2aa29c32011-03-19 08:53:53 +000031 begin = rdtsc();
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000032
33 hash(block + align,blocksize,itrial,temp);
34
tanjent@gmail.com2aa29c32011-03-19 08:53:53 +000035 end = rdtsc();
tanjent@gmail.comad4b3632010-11-05 01:20:58 +000036
37 blackhole(temp[0]);
38
39 double cycles = double(end-begin);
40 double bpc = double(blocksize) / cycles;
41 if(bpc > bestbpc) bestbpc = bpc;
42 }
43
44 double bestbps = (bestbpc * 3000000000.0 / 1048576.0);
45 printf("Alignment %2d - %6.3f bytes/cycle - %7.2f MiB/sec @ 3 ghz\n",align,bestbpc,bestbps);
46 }
47
48 delete [] block;
49}
tanjent@gmail.combabb5532011-02-28 06:03:12 +000050
51//-----------------------------------------------------------------------------
52
53void TinySpeedTest ( pfHash hash, int hashsize, int keysize, bool verbose, double & outCycles )
54{
55 const int trials = 100000;
56
57 if(verbose) printf("Small key speed test - %4d-byte keys - ",keysize);
58
59 uint8_t * h = new uint8_t[hashsize];
60 uint8_t * k = new uint8_t[keysize];
61
62 double bestcycles = 1e9;
63
64 for(int itrial = 0; itrial < trials; itrial++)
65 {
tanjent@gmail.com2aa29c32011-03-19 08:53:53 +000066 int64_t begin,end;
tanjent@gmail.combabb5532011-02-28 06:03:12 +000067
68 rand_p(k,keysize);
69
tanjent@gmail.com2aa29c32011-03-19 08:53:53 +000070 begin = rdtsc();
tanjent@gmail.combabb5532011-02-28 06:03:12 +000071
72 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
73 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
74 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
75 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
76
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);
79 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
80 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
81
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);
84 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
85 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
86
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);
89 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
90 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
91
tanjent@gmail.com2aa29c32011-03-19 08:53:53 +000092 end = rdtsc();
tanjent@gmail.combabb5532011-02-28 06:03:12 +000093
94 //blackhole(*(uint32_t*)(&h));
95
96 double cycles = double(end-begin) / 64;
97 if(cycles < bestcycles) bestcycles = cycles;
98 }
99
100 double bestbpc = double(keysize) / bestcycles;
101 if(verbose) printf("%8.2f cycles/hash, %8.4f bytes/cycle\n",bestcycles,bestbpc);
102
103 outCycles = bestcycles;
104}
105
106//-----------------------------------------------------------------------------