我最近从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中的数组相当。