C++读取二进制文件中int类型图像像素数据的代码优化问题
二进制图像文件读取性能优化方案
原有代码性能瓶颈
- 逐字节读取:近5000万次(409640963=50331648)的单字节读取操作带来了极高的IO和函数调用开销
- 未预分配内存:vector动态扩容过程中会反复申请内存、拷贝已有数据,额外消耗大量时间
- eof判断逻辑存在缺陷:文件读取完成后eof标志才会置位,会多执行一次无效的读取操作
- 隐藏逻辑问题:若编译器默认char为有符号类型,取值大于127的像素值会被符号扩展为负数,和实际8位像素的0-255取值范围不符
优化实现方案
核心优化思路是减少IO操作次数、避免内存动态扩容,优化后代码如下:
#include <fstream> #include <vector> #include <filesystem> std::vector<int> _data; // 可选优化:如果后续业务允许,改用unsigned char存储像素可减少3/4内存占用,速度更快 // std::vector<unsigned char> _data; std::ifstream file(_rgbFile.string(), std::ios::binary | std::ios::ate); if (!file.is_open()) { // 可自行补充文件打开失败的处理逻辑 return; } // 获取文件总大小 std::streamsize fileSize = file.tellg(); file.seekg(0, std::ios::beg); // 预分配足够的存储空间,完全避免动态扩容 _data.resize(static_cast<size_t>(fileSize)); // 一次性读取全部文件内容到vector中,仅执行1次IO操作 file.read(reinterpret_cast<char*>(_data.data()), fileSize); // 若需要确保像素值为0-255的正整数,可以改用如下读取逻辑配合int类型vector: // std::vector<unsigned char> tmpBuf(static_cast<size_t>(fileSize)); // file.read(reinterpret_cast<char*>(tmpBuf.data()), fileSize); // _data.assign(tmpBuf.begin(), tmpBuf.end()); std::cout << "end" << std::endl; file.close();
额外性能优化建议
- 可以在程序初始化阶段添加
std::ios::sync_with_stdio(false);,关闭C++流和C标准IO的同步逻辑,进一步提升流读取性能 - 若不需要跨平台兼容,也可以直接使用操作系统原生的文件读取API(如Windows的ReadFile、Linux的read),可以获得比标准流更高的读取性能
内容的提问来源于stack exchange,提问作者Fedour Traktor
相关产品推荐
相关产品推荐

