【问题标题】:Optimized bulk read for the CC_SHA256_Update优化 CC_SHA256_Update 的批量读取
【发布时间】: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;

【问题讨论】:

标签: c openssl sha256


【解决方案1】:

我认为只有使用不同大小进行测试才能清楚地说明这一点,但可能首选 64kB(分配粒度)的倍数。

但为了获得最佳性能,您可以考虑直接在 file 上使用 memory mapping。这将消除将所有数据从内核模式(操作系统磁盘缓存)复制到用户模式的需要。您将直接访问操作系统缓存,并且您可能只需要调用一次CC_SHA256_Update()

【讨论】:

  • Plus One 用于内存映射 I/O
  • 嗨,不幸的是 mmap 方法并没有使代码更高效。也许你可以看看我上面的实现,如果你认为我可以改进它,请告诉我。谢谢
  • @Zohar81 - 根据 SHA256 占用的(处理器)时间,速度增益可能很小(还考虑到这是一次性的,仅向前读取,已由操作系统优化),但是它不应该花费更长的时间。但请尝试使用MAP_PRIVATE 而不是MAP_SHARED。也不要忘记调用munmap()(并检查mmap()的返回值)。
猜你喜欢
  • 2012-02-06
  • 1970-01-01
  • 2021-01-07
  • 2016-12-20
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2012-11-10
  • 2019-06-24
相关资源
最近更新 更多