【发布时间】:2016-01-04 13:59:42
【问题描述】:
我有以下代码来计算输入的 sha_256,我想知道如何知道 CC_SHA256_Update 每次迭代的最佳数据块大小是多少。它是常数值还是取决于系统环境的变量?
CC_SHA256_CTX sha256;
CC_SHA256_Init(&sha256);
const long bufSize = 32768; //how can i find the optimized size ?
char* buffer = (char *) malloc(bufSize);
int bytesRead = 0;
if(!buffer) {
return -1;
}
while((bytesRead = (int) fread(buffer, 1, bufSize, file))) {
CC_SHA256_Update(&sha256, buffer, bytesRead);
}
编辑:我尝试了一种不同的方法,如下面所选答案中所述,并使用 mmap(而不是 malloc+fread)获取数据。不幸的是,id 并没有提高运行时效率(它略有增加)
int fsize(const char *filename) {
struct stat st;
if (stat(filename, &st) == 0)
return st.st_size;
return -1;
}
int fd = open(path, O_RDONLY);
int sz = fsize(path);
char * buffer = mmap((caddr_t)0, sz, PROT_READ , MAP_SHARED, fd, 0);
CC_SHA256_CTX sha256;
CC_SHA256_Init(&sha256);
CC_SHA256_Update(&sha256, buffer, sz);
CC_SHA256_Final(output, &sha256);
close(fd);
return 0;
【问题讨论】:
-
底层文件系统缓存管理器可能会读取最佳大小的块,因此您不必担心太多。基准测试可能是最好的工具。另见optimal buffer size for reading file in C、Optimum file buffer read size、What is the best buffer size when using BinaryReader to read big files、...