I made some tests with std::ifstream on MSVC, when reading binary files. I have big performance differences between char and unsigned char data types.
Results when reading a 512 MB binary file:
Duration read as signed: 322 ms
Duration read as unsigned: 10552 ms
Below the code I used to test:
#include <vector>
#include <iostream>
#include <fstream>
#include <chrono>
#include <limits>
#include <filesystem>
int main()
{
const std::filesystem::path filePath{ "test.data" }; // 512 MB binary file
const size_t fileSize{ std::filesystem::file_size(filePath) };
{
std::basic_ifstream<char> fileStream{ filePath, std::fstream::binary };
std::vector<char> data;
data.resize(fileSize);
const auto start{ std::chrono::system_clock::now() };
fileStream.read(data.data(), fileSize);
const auto end{ std::chrono::system_clock::now() };
std::cout << "Duration read as signed: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << " ms" << std::endl;
}
{
std::basic_ifstream<unsigned char> fileStream{ filePath, std::fstream::binary };
std::vector<unsigned char> data;
data.resize(fileSize);
const auto start{ std::chrono::system_clock::now() };
fileStream.read(data.data(), fileSize);
const auto end{ std::chrono::system_clock::now() };
std::cout << "Duration read as unsigned: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << " ms" << std::endl;
}
return 0;
}
I don't understand how using a basic_ifstream<unsigned char> is 30 times slower than basic_ifstream<char> when reading a binary file.