C++中二进制文件数据读入缓冲区的优化

ql3eal8s  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(152)

我写了一个小的命令行工具,我需要循环和迭代一个巨大的文件服务器。逻辑真的很简单。但它需要很多时间。我发现问题是读取二进制文件到一个缓冲区。我想举行的实现容易,因为它的c++和其他一些人也必须了解代码。

std::ifstream input( foundFile.c_str(), std::ios::binary );
std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(input), {});

最后我想我必须重构成块阅读。但是总的来说,为什么这种方式读入文件二进制文件这么慢呢?
完整来源:https://gitlab.com/Onnebrink/cltools/-/blob/main/src/dupfind/dupfind.cpp

plupiseo

plupiseo1#

现在,它快多了。我想我必须稍微使用一下bufferSize。也许4096byte太小了。但是我没有一个很好的概述关于它将被发现的文件大小的平均情况。也许我应该根据创建的文件大小使它更具适应性

unsigned long long calcHash(string &foundFile) {
  const int bufferSize=4096;
  unsigned long long hashValue = 0xeba29ce484222325ULL;
  unsigned long long magicPrime = 0xad3760fd485d7f11ULL;
  ifstream inFile(foundFile.c_str(), std::ios::binary);
  vector<char> buffer(bufferSize);
  while (!inFile.eof()) {
    inFile.read(buffer.data(), bufferSize);
    for (streamsize i = 0; i < inFile.gcount(); i++)
      hashValue ^= buffer[i], hashValue *= magicPrime;
  }
  return hashValue;
}

相关问题