代码之家  ›  专栏  ›  技术社区  ›  Evelyn

C++是否有一个快速多维数组,允许不同大小的子数组

  •  0
  • Evelyn  · 技术社区  · 1 年前

    我最近从Java切换到C++,并注意到使用标准库数组时性能有所下降。我用Java和C++编写了相同的程序(或者至少尽我所能地相似)来记录它们的运行时。

    Java代码:

        public static void main(String args[]) {
            long stime = System.currentTimeMillis();
            
            double[][] arr = new double[4][];
            arr[0] = new double[5];
            arr[1] = new double[10];
            arr[2] = new double[5];
            arr[3] = new double[8];
            
            for(int l = 0; l < arr.length; l++) {
                for(int i  = 0; i < arr[l].length; i++) {
                    arr[l][i] = 1;
                }
            }
            
            for(int t = 0; t < 100000000; t++) {
                for(int l = 0; l < arr.length; l++) {
                    for(int i  = 0; i < arr[l].length; i++) {
                        arr[l][i] += t;
                        arr[l][i] *= t;
                        arr[l][i] /= t;
                    }
                }
            }
            
            System.out.println("time: " + ((System.currentTimeMillis() - stime) / 1000.0f));
        }
    

    C++代码:

    int main()
    {
        int subarray_sizes[] = {5,10,5,8};
    
        double** arr = new double*[4];
        arr[0] = new double[subarray_sizes[0]];
        arr[1] = new double[subarray_sizes[1]];
        arr[2] = new double[subarray_sizes[2]];
        arr[3] = new double[subarray_sizes[3]];
    
        for(int l = 0; l < 4; l++){
            for(int i = 0; i < subarray_sizes[l]; i++){
                arr[l][i] = 1;
    
            }
        }
    
        for(int t = 0; t < 100000000; t++){
            for(int l = 0; l < 4; l++){
                for(int i = 0; i < subarray_sizes[l]; i++){
                    arr[l][i] += t;
                    arr[l][i] *= t;
                    arr[l][i] /= t;
                }
            }
        }
    
        delete[] arr[3];
        delete[] arr[2];
        delete[] arr[1];
        delete[] arr[0];
        delete[] arr;
    }
    

    Java程序的一次运行耗时3.125秒,C++程序耗时25.372秒。我知道这不是衡量性能的最佳方法,但我怀疑运行时的这种差异只是随机的。

    我还看到在许多C++程序中用向量代替数组,所以我用向量编写了一个程序。 C++代码:

    int main()
    {
        int subarray_sizes[] = {5,10,5,8};
    
        std::vector<std::vector<double>> arr(4);
        arr[0].resize(5);
        arr[1].resize(10);
        arr[2].resize(5);
        arr[3].resize(8);
    
        for(int l = 0; l < arr.size(); l++){
            for(int i = 0; i < arr[l].size(); i++){
                arr[l][i] = 1;
    
            }
        }
    
        for(int t = 0; t < 100000000; t++){
            for(int l = 0; l < arr.size(); l++){
                for(int i = 0; i < arr[l].size(); i++){
                    arr[l][i] += t;
                    arr[l][i] *= t;
                    arr[l][i] /= t;
                }
            }
        }
    }
    

    然而,这场比赛的表现最差,为46.806秒。

    简而言之,我想知道C++中是否有一种数据结构允许我拥有可变长度的子数组,其运行时与java中的数组相当。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Joseph Larson    1 年前

    我逐字逐句地读了你的第一个版本:

    $ g++ -O2 foo.cpp -o foo
    $ time foo
    
    real    0m0.822s
    user    0m0.800s
    sys 0m0.005s
    

    正如其他人所建议的那样,你希望启用优化。我几乎没有启用任何( -O2 参数——这是一个哦,不是零),而且我没有在调试模式下在IDE中运行。如您所见,我是通过命令行完成的。

    我使用的是M2 Mac,大约是一台9个月大的机器。

    你看,8/10秒。