aboutsummaryrefslogtreecommitdiffstats
path: root/src/benchmark
diff options
context:
space:
mode:
authorlloyd <[email protected]>2009-12-01 12:00:48 +0000
committerlloyd <[email protected]>2009-12-01 12:00:48 +0000
commit874dbb8323dd4d7eff3ff16cff0cfafc16ddbfa7 (patch)
treebc3a84c43c5924119972f24da3af89317694f0cb /src/benchmark
parent78f5726220b637cd8ae117bbcf8ff8d6c8dfeaed (diff)
Consolidate the non-canonical epoch timers, like cpuid and Win32's
QueryPerformanceCounter, into an entropy source hres_timer. Its results, if any, do not count as contributing entropy to the poll. Convert the other (monotonic/fixed epoch) timers to a single function get_nanoseconds_clock(), living in time.h, which statically chooses the 'best' timer type (clock_gettime, gettimeofday, std::clock, in that order depending on what is available). Add feature test macros for clock_gettime and gettimeofday. Remove the Timer class and timer.h. Remove the Timer& argument to the algorithm benchmark function.
Diffstat (limited to 'src/benchmark')
-rw-r--r--src/benchmark/benchmark.cpp43
-rw-r--r--src/benchmark/benchmark.h25
-rw-r--r--src/benchmark/info.txt1
3 files changed, 21 insertions, 48 deletions
diff --git a/src/benchmark/benchmark.cpp b/src/benchmark/benchmark.cpp
index 41c9cd10c..69d3a40ec 100644
--- a/src/benchmark/benchmark.cpp
+++ b/src/benchmark/benchmark.cpp
@@ -11,6 +11,7 @@
#include <botan/stream_cipher.h>
#include <botan/hash.h>
#include <botan/mac.h>
+#include <botan/time.h>
#include <memory>
namespace Botan {
@@ -21,19 +22,19 @@ namespace {
* Benchmark BufferedComputation (hash or MAC)
*/
std::pair<u64bit, u64bit> bench_buf_comp(BufferedComputation* buf_comp,
- Timer& timer,
u64bit nanoseconds_max,
const byte buf[], u32bit buf_len)
{
- const u64bit start = timer.clock();
- u64bit nanoseconds_used = 0;
u64bit reps = 0;
+ const u64bit start = get_nanoseconds_clock();
+ u64bit nanoseconds_used = 0;
+
while(nanoseconds_used < nanoseconds_max)
{
buf_comp->update(buf, buf_len);
++reps;
- nanoseconds_used = timer.clock() - start;
+ nanoseconds_used = get_nanoseconds_clock() - start;
}
return std::make_pair(reps * buf_len, nanoseconds_used);
@@ -44,15 +45,15 @@ std::pair<u64bit, u64bit> bench_buf_comp(BufferedComputation* buf_comp,
*/
std::pair<u64bit, u64bit>
bench_block_cipher(BlockCipher* block_cipher,
- Timer& timer,
u64bit nanoseconds_max,
byte buf[], u32bit buf_len)
{
- const u64bit start = timer.clock();
- u64bit nanoseconds_used = 0;
+ const u32bit in_blocks = buf_len / block_cipher->BLOCK_SIZE;
+
u64bit reps = 0;
- const u32bit in_blocks = buf_len / block_cipher->BLOCK_SIZE;
+ const u64bit start = get_nanoseconds_clock();
+ u64bit nanoseconds_used = 0;
block_cipher->set_key(buf, block_cipher->MAXIMUM_KEYLENGTH);
@@ -61,7 +62,7 @@ bench_block_cipher(BlockCipher* block_cipher,
block_cipher->encrypt_n(buf, buf, in_blocks);
++reps;
- nanoseconds_used = timer.clock() - start;
+ nanoseconds_used = get_nanoseconds_clock() - start;
}
return std::make_pair(reps * in_blocks * block_cipher->BLOCK_SIZE,
@@ -73,21 +74,21 @@ bench_block_cipher(BlockCipher* block_cipher,
*/
std::pair<u64bit, u64bit>
bench_stream_cipher(StreamCipher* stream_cipher,
- Timer& timer,
u64bit nanoseconds_max,
byte buf[], u32bit buf_len)
{
- const u64bit start = timer.clock();
- u64bit nanoseconds_used = 0;
u64bit reps = 0;
+ const u64bit start = get_nanoseconds_clock();
+ u64bit nanoseconds_used = 0;
+
stream_cipher->set_key(buf, stream_cipher->MAXIMUM_KEYLENGTH);
while(nanoseconds_used < nanoseconds_max)
{
stream_cipher->cipher1(buf, buf_len);
++reps;
- nanoseconds_used = timer.clock() - start;
+ nanoseconds_used = get_nanoseconds_clock() - start;
}
return std::make_pair(reps * buf_len, nanoseconds_used);
@@ -97,11 +98,11 @@ bench_stream_cipher(StreamCipher* stream_cipher,
* Benchmark hash
*/
std::pair<u64bit, u64bit>
-bench_hash(HashFunction* hash, Timer& timer,
+bench_hash(HashFunction* hash,
u64bit nanoseconds_max,
const byte buf[], u32bit buf_len)
{
- return bench_buf_comp(hash, timer, nanoseconds_max, buf, buf_len);
+ return bench_buf_comp(hash, nanoseconds_max, buf, buf_len);
}
/**
@@ -109,12 +110,11 @@ bench_hash(HashFunction* hash, Timer& timer,
*/
std::pair<u64bit, u64bit>
bench_mac(MessageAuthenticationCode* mac,
- Timer& timer,
u64bit nanoseconds_max,
const byte buf[], u32bit buf_len)
{
mac->set_key(buf, mac->MAXIMUM_KEYLENGTH);
- return bench_buf_comp(mac, timer, nanoseconds_max, buf, buf_len);
+ return bench_buf_comp(mac, nanoseconds_max, buf, buf_len);
}
}
@@ -122,7 +122,6 @@ bench_mac(MessageAuthenticationCode* mac,
std::map<std::string, double>
algorithm_benchmark(const std::string& name,
u32bit milliseconds,
- Timer& timer,
RandomNumberGenerator& rng,
Algorithm_Factory& af)
{
@@ -148,7 +147,7 @@ algorithm_benchmark(const std::string& name,
af.prototype_block_cipher(name, provider))
{
std::auto_ptr<BlockCipher> block_cipher(proto->clone());
- results = bench_block_cipher(block_cipher.get(), timer,
+ results = bench_block_cipher(block_cipher.get(),
ns_per_provider,
&buf[0], buf.size());
}
@@ -156,7 +155,7 @@ algorithm_benchmark(const std::string& name,
af.prototype_stream_cipher(name, provider))
{
std::auto_ptr<StreamCipher> stream_cipher(proto->clone());
- results = bench_stream_cipher(stream_cipher.get(), timer,
+ results = bench_stream_cipher(stream_cipher.get(),
ns_per_provider,
&buf[0], buf.size());
}
@@ -164,14 +163,14 @@ algorithm_benchmark(const std::string& name,
af.prototype_hash_function(name, provider))
{
std::auto_ptr<HashFunction> hash(proto->clone());
- results = bench_hash(hash.get(), timer, ns_per_provider,
+ results = bench_hash(hash.get(), ns_per_provider,
&buf[0], buf.size());
}
else if(const MessageAuthenticationCode* proto =
af.prototype_mac(name, provider))
{
std::auto_ptr<MessageAuthenticationCode> mac(proto->clone());
- results = bench_mac(mac.get(), timer, ns_per_provider,
+ results = bench_mac(mac.get(), ns_per_provider,
&buf[0], buf.size());
}
diff --git a/src/benchmark/benchmark.h b/src/benchmark/benchmark.h
index 1b2730105..9c4e410f1 100644
--- a/src/benchmark/benchmark.h
+++ b/src/benchmark/benchmark.h
@@ -9,40 +9,16 @@
#define BOTAN_RUNTIME_BENCHMARK_H__
#include <botan/algo_factory.h>
-#include <botan/timer.h>
#include <botan/rng.h>
#include <map>
#include <string>
-/**
-* Choose some sort of default timer implementation to use, since some
-* (like hardware tick counters and current Win32 timer) are not
-* reliable for benchmarking.
-*/
-#if defined(BOTAN_HAS_TIMER_POSIX)
- #include <botan/tm_posix.h>
-#elif defined(BOTAN_HAS_TIMER_UNIX)
- #include <botan/tm_unix.h>
-#endif
-
namespace Botan {
-#if defined(BOTAN_HAS_TIMER_POSIX)
- typedef POSIX_Timer Default_Benchmark_Timer;
-#elif defined(BOTAN_HAS_TIMER_UNIX)
- typedef Unix_Timer Default_Benchmark_Timer;
-#else
- /* I have not had good success using clock(), the results seem
- * pretty bogus, but as a last resort it works.
- */
- typedef ANSI_Clock_Timer Default_Benchmark_Timer;
-#endif
-
/**
* Algorithm benchmark
* @param name the name of the algorithm to test (cipher, hash, or MAC)
* @param milliseconds total time for the benchmark to run
-* @param timer the timer to use
* @param rng the rng to use to generate random inputs
* @param af the algorithm factory used to create objects
* @return results a map from provider to speed in mebibytes per second
@@ -50,7 +26,6 @@ namespace Botan {
std::map<std::string, double>
BOTAN_DLL algorithm_benchmark(const std::string& name,
u32bit milliseconds,
- Timer& timer,
RandomNumberGenerator& rng,
Algorithm_Factory& af);
diff --git a/src/benchmark/info.txt b/src/benchmark/info.txt
index f148ae5ce..0210971f7 100644
--- a/src/benchmark/info.txt
+++ b/src/benchmark/info.txt
@@ -15,5 +15,4 @@ hash
mac
rng
stream
-timer
</requires>