在 Windows 上从文件填充多维矩阵很慢
Filling multidimensional matrix from file is slow on Windows
我写了一个C++(Rcpp(函数来读取和填充仅包含数字的文件中的多维矩阵。当我在 Linux 上运行它时,它工作正常,而且速度非常快。但是,在具有相同规格的 Windows 计算机上,相同的代码要慢得多(200 倍(。任何人都可以发现问题吗?
void read_ed0moins_lut_(const char *filename, float downward_irradiance_table_as_output[NBWL][NTHETAS][NO3][NTAUCLD][NALB]) {
std::ifstream infile;
infile.open(filename);
float tmp;
for (int theta = 0; theta < NTHETAS; theta++) {
for (int ozone = 0; ozone < NO3; ozone++) {
for (int taucl = 0; taucl < NTAUCLD; taucl++) {
for (int albedo = 0; albedo < NALB; albedo++) {
for (int wavelength = 0; wavelength < NBWL; wavelength++) {
infile >> tmp; // This line is very slow on Windows
downward_irradiance_table_as_output[wavelength][theta][ozone][taucl][albedo] = tmp;
}
}
}
}
}
// Close file
infile.close();
}
这里有一些想法:
-
在发布模式下构建(启用优化,
-O2
标志( -
启用
ifstream
缓冲:
std::ifstream infile(filename);
char buffer[65536];
infile.rdbuf()->pubsetbuf(buffer, sizeof(buffer));
按循环顺序排列数组的尺寸:
downward_irradiance_table_as_output[NTHETAS][NO3][NTAUCLD][NALB][NBWL]
这样你就可以得到行主序遍历,这对缓存更友好。
相关文章:
- 在c++中用vector填充一个简单的动态数组
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 在Linux for Windows上编译C++代码时出错
- 在Windows上用C++裁剪HBITMAP
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- 如何使用用户输入在C++中正确填充2D数组
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何找到大小'x'数组是否完全填充,在C++?
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 通过for循环使用用户输入填充列表
- 在Windows中以.exe的形式运行c++
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- GSTREAMER管道播放,但没有填充的回调(仅在Android上发生,在Windows和Linux上可行)
- 在 Windows 上从文件填充多维矩阵很慢
- 如何在Windows通用文件对话框中显示API填充的虚拟文件夹