blob: d95acd43504035e2b0d8daba166dca25df4f316f [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
6#include <intrin.h> // for __rdtsc
7
8//-----------------------------------------------------------------------------
9// 256k blocks seem to give the best results.
10
11void BulkSpeedTest ( pfHash hash )
12{
13 const int trials = 9999;
14 const int blocksize = 256 * 1024;
15
16 printf("Bulk speed test - %d-byte keys\n",blocksize);
17
18 char * block = new char[blocksize + 16];
19
20 rand_p(block,blocksize+16);
21
22 uint32_t temp[16];
23
24 for(int align = 0; align < 8; align++)
25 {
26 double bestbpc = 0;
27
28 for(int itrial = 0; itrial < trials; itrial++)
29 {
30 __int64 begin,end;
31
32 begin = __rdtsc();
33
34 hash(block + align,blocksize,itrial,temp);
35
36 end = __rdtsc();
37
38 blackhole(temp[0]);
39
40 double cycles = double(end-begin);
41 double bpc = double(blocksize) / cycles;
42 if(bpc > bestbpc) bestbpc = bpc;
43 }
44
45 double bestbps = (bestbpc * 3000000000.0 / 1048576.0);
46 printf("Alignment %2d - %6.3f bytes/cycle - %7.2f MiB/sec @ 3 ghz\n",align,bestbpc,bestbps);
47 }
48
49 delete [] block;
50}
tanjent@gmail.combabb5532011-02-28 06:03:12 +000051
52//-----------------------------------------------------------------------------
53
54void TinySpeedTest ( pfHash hash, int hashsize, int keysize, bool verbose, double & outCycles )
55{
56 const int trials = 100000;
57
58 if(verbose) printf("Small key speed test - %4d-byte keys - ",keysize);
59
60 uint8_t * h = new uint8_t[hashsize];
61 uint8_t * k = new uint8_t[keysize];
62
63 double bestcycles = 1e9;
64
65 for(int itrial = 0; itrial < trials; itrial++)
66 {
67 __int64 begin,end;
68
69 rand_p(k,keysize);
70
71 begin = __rdtsc();
72
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 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
77
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 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
82
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 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
87
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 hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h); hash(k,keysize,itrial,h);
92
93 end = __rdtsc();
94
95 //blackhole(*(uint32_t*)(&h));
96
97 double cycles = double(end-begin) / 64;
98 if(cycles < bestcycles) bestcycles = cycles;
99 }
100
101 double bestbpc = double(keysize) / bestcycles;
102 if(verbose) printf("%8.2f cycles/hash, %8.4f bytes/cycle\n",bestcycles,bestbpc);
103
104 outCycles = bestcycles;
105}
106
107//-----------------------------------------------------------------------------