在 Windows 上从文件填充多维矩阵很慢

Filling multidimensional matrix from file is slow on Windows

本文关键字:填充 Windows 文件      更新时间:2023-10-16

我写了一个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();
}

这里有一些想法:

  1. 发布模式下构建(启用优化,-O2标志(

  2. 启用ifstream缓冲:

    std::ifstream infile(filename);
    char buffer[65536];
    infile.rdbuf()->pubsetbuf(buffer, sizeof(buffer));
  1. 按循环顺序排列数组的尺寸:

    downward_irradiance_table_as_output[NTHETAS][NO3][NTAUCLD][NALB][NBWL]

    这样你就可以得到行主序遍历,这对缓存更友好。