md5/shaXsum: use FEATURE_COPYBUF_KB to size the buffer instead of fixed 4k
function old new delta md5_sha1_sum_main 536 565 +29 hash_file 419 401 -18 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/1 up/down: 29/-18) Total: 11 bytes In my test, for unrolled sha1, COPYBUF_KB=64 increases throughput from 367 MB/s to 457 MB/s. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
7abb2bb96e
commit
1fc520ed28
@ -151,10 +151,12 @@ static unsigned char *hash_bin_to_hex(unsigned char *hash_value,
|
|||||||
return (unsigned char *)hex_value;
|
return (unsigned char *)hex_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define BUFSZ (CONFIG_FEATURE_COPYBUF_KB < 4 ? 4096 : CONFIG_FEATURE_COPYBUF_KB * 1024)
|
||||||
|
|
||||||
#if !ENABLE_SHA3SUM
|
#if !ENABLE_SHA3SUM
|
||||||
# define hash_file(f,w) hash_file(f)
|
# define hash_file(b,f,w) hash_file(b,f)
|
||||||
#endif
|
#endif
|
||||||
static uint8_t *hash_file(const char *filename, unsigned sha3_width)
|
static uint8_t *hash_file(unsigned char *in_buf, const char *filename, unsigned sha3_width)
|
||||||
{
|
{
|
||||||
int src_fd, hash_len, count;
|
int src_fd, hash_len, count;
|
||||||
union _ctx_ {
|
union _ctx_ {
|
||||||
@ -227,8 +229,7 @@ static uint8_t *hash_file(const char *filename, unsigned sha3_width)
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
RESERVE_CONFIG_UBUFFER(in_buf, 4096);
|
while ((count = safe_read(src_fd, in_buf, BUFSZ)) > 0) {
|
||||||
while ((count = safe_read(src_fd, in_buf, 4096)) > 0) {
|
|
||||||
update(&context, in_buf, count);
|
update(&context, in_buf, count);
|
||||||
}
|
}
|
||||||
hash_value = NULL;
|
hash_value = NULL;
|
||||||
@ -238,7 +239,6 @@ static uint8_t *hash_file(const char *filename, unsigned sha3_width)
|
|||||||
final(&context, in_buf);
|
final(&context, in_buf);
|
||||||
hash_value = hash_bin_to_hex(in_buf, hash_len);
|
hash_value = hash_bin_to_hex(in_buf, hash_len);
|
||||||
}
|
}
|
||||||
RELEASE_CONFIG_BUFFER(in_buf);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src_fd != STDIN_FILENO) {
|
if (src_fd != STDIN_FILENO) {
|
||||||
@ -251,6 +251,7 @@ static uint8_t *hash_file(const char *filename, unsigned sha3_width)
|
|||||||
int md5_sha1_sum_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
int md5_sha1_sum_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv)
|
int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv)
|
||||||
{
|
{
|
||||||
|
unsigned char *in_buf;
|
||||||
int return_value = EXIT_SUCCESS;
|
int return_value = EXIT_SUCCESS;
|
||||||
unsigned flags;
|
unsigned flags;
|
||||||
#if ENABLE_SHA3SUM
|
#if ENABLE_SHA3SUM
|
||||||
@ -279,6 +280,12 @@ int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
if (!*argv)
|
if (!*argv)
|
||||||
*--argv = (char*)"-";
|
*--argv = (char*)"-";
|
||||||
|
|
||||||
|
/* The buffer is not alloc/freed for each input file:
|
||||||
|
* for big values of COPYBUF_KB, this helps to keep its pages
|
||||||
|
* pre-faulted and possibly even fully cached on local CPU.
|
||||||
|
*/
|
||||||
|
in_buf = xmalloc(BUFSZ);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (ENABLE_FEATURE_MD5_SHA1_SUM_CHECK && (flags & FLAG_CHECK)) {
|
if (ENABLE_FEATURE_MD5_SHA1_SUM_CHECK && (flags & FLAG_CHECK)) {
|
||||||
FILE *pre_computed_stream;
|
FILE *pre_computed_stream;
|
||||||
@ -310,7 +317,7 @@ int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
*filename_ptr = '\0';
|
*filename_ptr = '\0';
|
||||||
filename_ptr += 2;
|
filename_ptr += 2;
|
||||||
|
|
||||||
hash_value = hash_file(filename_ptr, sha3_width);
|
hash_value = hash_file(in_buf, filename_ptr, sha3_width);
|
||||||
|
|
||||||
if (hash_value && (strcmp((char*)hash_value, line) == 0)) {
|
if (hash_value && (strcmp((char*)hash_value, line) == 0)) {
|
||||||
if (!(flags & FLAG_SILENT))
|
if (!(flags & FLAG_SILENT))
|
||||||
@ -339,7 +346,7 @@ int md5_sha1_sum_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
}
|
}
|
||||||
fclose_if_not_stdin(pre_computed_stream);
|
fclose_if_not_stdin(pre_computed_stream);
|
||||||
} else {
|
} else {
|
||||||
uint8_t *hash_value = hash_file(*argv, sha3_width);
|
uint8_t *hash_value = hash_file(in_buf, *argv, sha3_width);
|
||||||
if (hash_value == NULL) {
|
if (hash_value == NULL) {
|
||||||
return_value = EXIT_FAILURE;
|
return_value = EXIT_FAILURE;
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user