Cache the header length when generating stratum work to avoid calculating it on every work generation, and to only need one alloc+sprintf, speeding up work generation.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
diff --git a/cgminer.c b/cgminer.c
index 71b663b..ef7bf3b 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -5085,11 +5085,11 @@ static void set_work_target(struct work *work, double diff)
* other means to detect when the pool has died in stratum_thread */
static void gen_stratum_work(struct pool *pool, struct work *work)
{
- unsigned char *coinbase, merkle_root[32], merkle_sha[64], *merkle_hash;
+ unsigned char *coinbase, merkle_root[32], merkle_sha[64];
int len, cb1_len, n1_len, cb2_len, i;
+ char *header, *merkle_hash;
uint32_t *data32, *swap32;
size_t alloc_len;
- char *header;
mutex_lock(&pool->pool_lock);
@@ -5124,15 +5124,17 @@ static void gen_stratum_work(struct pool *pool, struct work *work)
swap32 = (uint32_t *)merkle_root;
for (i = 0; i < 32 / 4; i++)
swap32[i] = swab32(data32[i]);
- merkle_hash = (unsigned char *)bin2hex((const unsigned char *)merkle_root, 32);
-
- header = strdup(pool->swork.bbversion);
- header = realloc_strcat(header, pool->swork.prev_hash);
- header = realloc_strcat(header, (char *)merkle_hash);
- header = realloc_strcat(header, pool->swork.ntime);
- header = realloc_strcat(header, pool->swork.nbit);
- header = realloc_strcat(header, "00000000"); /* nonce */
- header = realloc_strcat(header, workpadding);
+ merkle_hash = bin2hex((const unsigned char *)merkle_root, 32);
+
+ header = calloc(pool->swork.header_len, 1);
+ sprintf(header, "%s%s%s%s%s%s%s",
+ pool->swork.bbversion,
+ pool->swork.prev_hash,
+ merkle_hash,
+ pool->swork.ntime,
+ pool->swork.nbit,
+ "00000000", /* nonce */
+ workpadding);
/* Store the stratum work diff to check it still matches the pool's
* stratum diff when submitting shares */
diff --git a/miner.h b/miner.h
index df2888e..8dbffa5 100644
--- a/miner.h
+++ b/miner.h
@@ -855,6 +855,7 @@ struct stratum_work {
char *ntime;
bool clean;
+ size_t header_len;
int merkles;
double diff;
};
diff --git a/util.c b/util.c
index 386298a..dd99e1b 100644
--- a/util.c
+++ b/util.c
@@ -1146,6 +1146,15 @@ static bool parse_notify(struct pool *pool, json_t *val)
pool->swork.merkles = merkles;
if (clean)
pool->nonce2 = 0;
+ pool->swork.header_len = strlen(pool->swork.bbversion) +
+ strlen(pool->swork.prev_hash) +
+ strlen(pool->swork.ntime) +
+ strlen(pool->swork.nbit) +
+ /* merkle_hash */ 32 +
+ /* nonce */ 8 +
+ /* workpadding */ 96;
+ pool->swork.header_len = pool->swork.header_len * 2 + 1;
+ align_len(&pool->swork.header_len);
mutex_unlock(&pool->pool_lock);
if (opt_protocol) {