在 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]
这样就可以得到row-major-order遍历,对缓存更友好
我编写了一个 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]
这样就可以得到row-major-order遍历,对缓存更友好