mirror of
https://github.com/amadvance/snapraid.git
synced 2026-10-26 19:01:57 -04:00
Improve speed benchmark stability with adaptive 1 ms sampling and best-result selection
This commit is contained in:
parent
2b784748e3
commit
0b356780c3
2 changed files with 75 additions and 79 deletions
|
|
@ -24,29 +24,35 @@ static int64_t diffgettimeofday(struct timeval* start, struct timeval* stop)
|
|||
return d;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start time measurement.
|
||||
*/
|
||||
/* INDENT-OFF */
|
||||
#define SPEED_START \
|
||||
count = 0; \
|
||||
gettimeofday(&start, 0); \
|
||||
do { \
|
||||
for (i = 0; i < delta; ++i)
|
||||
{ \
|
||||
int speed_delta_ = delta; \
|
||||
int64_t elapsed_ = 0; \
|
||||
int64_t best_dt_ = INT64_MAX; \
|
||||
do { \
|
||||
gettimeofday(&start, 0); \
|
||||
for (int i_ = 0; i_ < speed_delta_; ++i_)
|
||||
/* INDENT-ON */
|
||||
|
||||
/**
|
||||
* Stop time measurement.
|
||||
*/
|
||||
/* INDENT-OFF */
|
||||
#define SPEED_STOP \
|
||||
count += delta; \
|
||||
gettimeofday(&stop, 0); \
|
||||
} while (diffgettimeofday(&start, &stop) < period * 1000LL); \
|
||||
ds = size * (int64_t)count * nd; \
|
||||
dt = diffgettimeofday(&start, &stop);
|
||||
dt = diffgettimeofday(&start, &stop); \
|
||||
if (dt < 1000 && speed_delta_ <= INT_MAX / 2) { \
|
||||
speed_delta_ *= 2; \
|
||||
elapsed_ = 0; \
|
||||
best_dt_ = INT64_MAX; \
|
||||
continue; \
|
||||
} \
|
||||
elapsed_ += dt; \
|
||||
if (dt < best_dt_) \
|
||||
best_dt_ = dt; \
|
||||
} while (elapsed_ < period * 1000LL); \
|
||||
ds = size * (int64_t)speed_delta_ * nd; \
|
||||
dt = best_dt_; \
|
||||
}
|
||||
/* INDENT-ON */
|
||||
|
||||
/**
|
||||
* Global variable used to propagate side effects.
|
||||
*
|
||||
|
|
@ -61,16 +67,15 @@ void speed_mem(int nd, void** v, int size, int delta, int period)
|
|||
struct timeval stop;
|
||||
int64_t ds;
|
||||
int64_t dt;
|
||||
int i, j;
|
||||
int count;
|
||||
int i;
|
||||
|
||||
printf("Memory write speed using the C memset() function:\n");
|
||||
printf("%8s", "memset");
|
||||
fflush(stdout);
|
||||
|
||||
SPEED_START {
|
||||
for (j = 0; j < nd; ++j)
|
||||
memset(v[j], j, size);
|
||||
for (i = 0; i < nd; ++i)
|
||||
memset(v[i], i, size);
|
||||
} SPEED_STOP
|
||||
|
||||
printf("%8" PRIu64, ds / dt);
|
||||
|
|
@ -84,8 +89,7 @@ void speed_crc(int nd, void** v, int size, int delta, int period)
|
|||
struct timeval stop;
|
||||
int64_t ds;
|
||||
int64_t dt;
|
||||
int i, j;
|
||||
int count;
|
||||
int i;
|
||||
|
||||
/* crc table */
|
||||
printf("CRC used to check the content file integrity:\n");
|
||||
|
|
@ -94,8 +98,8 @@ void speed_crc(int nd, void** v, int size, int delta, int period)
|
|||
fflush(stdout);
|
||||
|
||||
SPEED_START {
|
||||
for (j = 0; j < nd; ++j)
|
||||
side_effect += crc32c_gen(0, v[j], size);
|
||||
for (i = 0; i < nd; ++i)
|
||||
side_effect += crc32c_gen(0, v[i], size);
|
||||
} SPEED_STOP
|
||||
|
||||
printf("%8" PRIu64, ds / dt);
|
||||
|
|
@ -107,8 +111,8 @@ void speed_crc(int nd, void** v, int size, int delta, int period)
|
|||
fflush(stdout);
|
||||
|
||||
SPEED_START {
|
||||
for (j = 0; j < nd; ++j)
|
||||
side_effect += crc32c_x86(0, v[j], size);
|
||||
for (i = 0; i < nd; ++i)
|
||||
side_effect += crc32c_x86(0, v[i], size);
|
||||
} SPEED_STOP
|
||||
|
||||
printf("%8" PRIu64, ds / dt);
|
||||
|
|
@ -121,8 +125,8 @@ void speed_crc(int nd, void** v, int size, int delta, int period)
|
|||
fflush(stdout);
|
||||
|
||||
SPEED_START {
|
||||
for (j = 0; j < nd; ++j)
|
||||
side_effect += crc32c_arm64(0, v[j], size);
|
||||
for (i = 0; i < nd; ++i)
|
||||
side_effect += crc32c_arm64(0, v[i], size);
|
||||
} SPEED_STOP
|
||||
|
||||
printf("%8" PRIu64, ds / dt);
|
||||
|
|
@ -138,8 +142,7 @@ void speed_hash(int nd, void** v, int size, int delta, int period)
|
|||
struct timeval stop;
|
||||
int64_t ds;
|
||||
int64_t dt;
|
||||
int i, j;
|
||||
int count;
|
||||
int i;
|
||||
unsigned char digest[HASH_MAX];
|
||||
unsigned char seed[HASH_MAX];
|
||||
|
||||
|
|
@ -162,24 +165,24 @@ void speed_hash(int nd, void** v, int size, int delta, int period)
|
|||
fflush(stdout);
|
||||
|
||||
SPEED_START {
|
||||
for (j = 0; j < nd; ++j)
|
||||
memhash(HASH_MURMUR3, seed, digest, v[j], size);
|
||||
for (i = 0; i < nd; ++i)
|
||||
memhash(HASH_MURMUR3, seed, digest, v[i], size);
|
||||
} SPEED_STOP
|
||||
|
||||
printf("%8" PRIu64, ds / dt);
|
||||
fflush(stdout);
|
||||
|
||||
SPEED_START {
|
||||
for (j = 0; j < nd; ++j)
|
||||
memhash(HASH_SPOOKY2, seed, digest, v[j], size);
|
||||
for (i = 0; i < nd; ++i)
|
||||
memhash(HASH_SPOOKY2, seed, digest, v[i], size);
|
||||
} SPEED_STOP
|
||||
|
||||
printf("%8" PRIu64, ds / dt);
|
||||
fflush(stdout);
|
||||
|
||||
SPEED_START {
|
||||
for (j = 0; j < nd; ++j)
|
||||
memhash(HASH_MUSEAIR, seed, digest, v[j], size);
|
||||
for (i = 0; i < nd; ++i)
|
||||
memhash(HASH_MUSEAIR, seed, digest, v[i], size);
|
||||
} SPEED_STOP
|
||||
|
||||
printf("%8" PRIu64, ds / dt);
|
||||
|
|
@ -193,8 +196,6 @@ void speed_gen(int nd, void** v, int size, int delta, int period, const char* ms
|
|||
struct timeval stop;
|
||||
int64_t ds;
|
||||
int64_t dt;
|
||||
int i;
|
||||
int count;
|
||||
int mode = raid_mode(RAID_MODE_GET);
|
||||
|
||||
/* RAID table */
|
||||
|
|
@ -1080,8 +1081,6 @@ void speed_genz(int nd, void** v, int size, int delta, int period)
|
|||
struct timeval stop;
|
||||
int64_t ds;
|
||||
int64_t dt;
|
||||
int i;
|
||||
int count;
|
||||
|
||||
/* Vandermonde table */
|
||||
printf("Vandermonde functions used for computing parity with 'sync':\n");
|
||||
|
|
@ -1204,7 +1203,6 @@ void speed_rec(int nd, void** v, int size, int delta, int period)
|
|||
int64_t ds;
|
||||
int64_t dt;
|
||||
int i;
|
||||
int count;
|
||||
int id[RAID_PARITY_MAX];
|
||||
int ip[RAID_PARITY_MAX];
|
||||
|
||||
|
|
@ -2358,9 +2356,8 @@ void speed(int period, int nd, int size)
|
|||
else
|
||||
size *= KIBI;
|
||||
if (period < 1)
|
||||
period = 1000;
|
||||
|
||||
delta = period >= 1000 ? 10 : 1;
|
||||
period = 250;
|
||||
delta = 1; /* auto increased in SPEED_START */
|
||||
|
||||
nv = nd + RAID_PARITY_MAX;
|
||||
|
||||
|
|
|
|||
|
|
@ -10,11 +10,16 @@
|
|||
#include <sys/time.h>
|
||||
#include <stdio.h>
|
||||
#include <inttypes.h>
|
||||
#include <limits.h>
|
||||
|
||||
/*
|
||||
* Size of the blocks to test.
|
||||
*/
|
||||
#ifdef COVERAGE
|
||||
#define TEST_SIZE (4 * 1024)
|
||||
#else
|
||||
#define TEST_SIZE (256 * 1024)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Number of data blocks to test.
|
||||
|
|
@ -34,35 +39,35 @@ static int64_t diffgettimeofday(struct timeval *start, struct timeval *stop)
|
|||
return d;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test period.
|
||||
*/
|
||||
#ifdef COVERAGE
|
||||
#define TEST_PERIOD 100000LL
|
||||
#define TEST_DELTA 1
|
||||
#else
|
||||
#define TEST_PERIOD 1000000LL
|
||||
#define TEST_DELTA 10
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Start time measurement.
|
||||
*/
|
||||
/* INDENT-OFF */
|
||||
#define SPEED_START \
|
||||
count = 0; \
|
||||
gettimeofday(&start, 0); \
|
||||
do { \
|
||||
for (i = 0; i < delta; ++i)
|
||||
{ \
|
||||
int speed_delta_ = delta; \
|
||||
int64_t elapsed_ = 0; \
|
||||
int64_t best_dt_ = INT64_MAX; \
|
||||
do { \
|
||||
gettimeofday(&start, 0); \
|
||||
for (int i_ = 0; i_ < speed_delta_; ++i_)
|
||||
/* INDENT-ON */
|
||||
|
||||
/**
|
||||
* Stop time measurement.
|
||||
*/
|
||||
/* INDENT-OFF */
|
||||
#define SPEED_STOP \
|
||||
count += delta; \
|
||||
gettimeofday(&stop, 0); \
|
||||
} while (diffgettimeofday(&start, &stop) < period); \
|
||||
ds = size * (int64_t)count * nd; \
|
||||
dt = diffgettimeofday(&start, &stop);
|
||||
dt = diffgettimeofday(&start, &stop); \
|
||||
if (dt < 1000 && speed_delta_ <= INT_MAX / 2) { \
|
||||
speed_delta_ *= 2; \
|
||||
elapsed_ = 0; \
|
||||
best_dt_ = INT64_MAX; \
|
||||
continue; \
|
||||
} \
|
||||
elapsed_ += dt; \
|
||||
if (dt < best_dt_) \
|
||||
best_dt_ = dt; \
|
||||
} while (elapsed_ < period * 1000LL); \
|
||||
ds = size * (int64_t)speed_delta_ * nd; \
|
||||
dt = best_dt_; \
|
||||
}
|
||||
/* INDENT-ON */
|
||||
|
||||
void speed_mem(int nd, void **v, int size, int delta, int period)
|
||||
{
|
||||
|
|
@ -70,16 +75,15 @@ void speed_mem(int nd, void **v, int size, int delta, int period)
|
|||
struct timeval stop;
|
||||
int64_t ds;
|
||||
int64_t dt;
|
||||
int i, j;
|
||||
int count;
|
||||
int i;
|
||||
|
||||
printf("Memory write speed using the C memset() function:\n");
|
||||
printf("%8s", "memset");
|
||||
fflush(stdout);
|
||||
|
||||
SPEED_START {
|
||||
for (j = 0; j < nd; ++j)
|
||||
memset(v[j], j, size);
|
||||
for (i = 0; i < nd; ++i)
|
||||
memset(v[i], i, size);
|
||||
} SPEED_STOP
|
||||
|
||||
printf("%8" PRIu64, ds / dt);
|
||||
|
|
@ -93,8 +97,6 @@ void speed_gen(int nd, void **v, int size, int delta, int period, const char *ms
|
|||
struct timeval stop;
|
||||
int64_t ds;
|
||||
int64_t dt;
|
||||
int i;
|
||||
int count;
|
||||
int mode = raid_mode(RAID_MODE_GET);
|
||||
|
||||
/* RAID table */
|
||||
|
|
@ -976,8 +978,6 @@ void speed_genz(int nd, void **v, int size, int delta, int period)
|
|||
struct timeval stop;
|
||||
int64_t ds;
|
||||
int64_t dt;
|
||||
int i;
|
||||
int count;
|
||||
|
||||
/* Vandermonde table */
|
||||
printf("Vandermonde functions used for computing the parity:\n");
|
||||
|
|
@ -1102,7 +1102,6 @@ void speed_rec(int nd, void **v, int size, int delta, int period)
|
|||
int i;
|
||||
int id[RAID_PARITY_MAX];
|
||||
int ip[RAID_PARITY_MAX];
|
||||
int count;
|
||||
|
||||
/* basic disks and parity mapping */
|
||||
for (i = 0; i < RAID_PARITY_MAX; ++i) {
|
||||
|
|
@ -2138,8 +2137,8 @@ void speed(void)
|
|||
void **v;
|
||||
int i;
|
||||
int size = TEST_SIZE;
|
||||
int delta = TEST_DELTA;
|
||||
int period = TEST_PERIOD;
|
||||
int period = 250;
|
||||
int delta = 1; /* auto increased in SPEED_START */
|
||||
|
||||
nv = nd + RAID_PARITY_MAX;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue