Как написать функцию на с++ лучше с точки зрения производительности?
Я переписываю программу с джавы на с++ и со следующей функцией возникли проблемы:
private static int[][] collectMatrix(int[][] a11, int[][] a12, int[][] a21, int[][] a22) {
int n = a11.length;
int[][] a = new int[n << 1][n << 1];
for (int i = 0; i < n; i++) {
System.arraycopy(a11[i], 0, a[i], 0, n);
System.arraycopy(a12[i], 0, a[i], n, n);
System.arraycopy(a21[i], 0, a[i + n], 0, n);
System.arraycopy(a22[i], 0, a[i + n], n, n);
}
return a;
}
Я переписал её следующим образом:
vector<vector<int>> collectMatrix(vector<vector<int>> a11, vector<vector<int>> a12, vector<vector<int>> a21, vector<vector<int>> a22) {
int n = a11.size();
vector<vector<int>> a;
a.resize(n << 1,vector<int>(n << 1));
for (int i = 0; i < n; i++) {
a[i].insert(a[i].begin(), a11[i].begin(), a11[i].end());
a[i].insert(a[i].begin() + n, a12[i].begin(), a12[i].end());
a[i+n].insert(a[i+n].begin(), a21[i].begin(), a21[i].end());
a[i+n].insert(a[i+n].begin() + n, a22[i].begin(), a22[i].end());
}
return a;
}
Но этот вариант через vector кажется мне медленным, поскольку я засекал время выполнения на обоих языках (не конкретно этих функций правда, но больше нечему тормозить), и оказалось, что на с++ медленнее, чем на java, чего быть не должно!! Поэтому я хочу изменить вариант с vector (массив с переменной длинной) на что-то быстрее, а именно на массив статического размера, поскольку в моей программе не обязательна переменная длина, статика тоже подойдёт, но не знаю как лучше это сделать. Круто, если поможете кусочком кода.
Ответы (1 шт):
Я бы переписал ваш вариант с векторами следующим образом:
vector<vector<int>> collectMatrix(const vector<vector<int>>& a11,
const vector<vector<int>>& a12,
const vector<vector<int>>& a21,
const vector<vector<int>>& a22)
{
int n = a11.size();
vector<vector<int>> a(2*n, vector<int>(2*n));
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
a[i][j] = a11[i][j];
a[i+n][j] = a21[i][j];
a[i][j+n] = a12[i][j];
a[i+n][j+n] = a22[i][j];
}
}
return a;
}
Для простоты не стал добавлять проверки, что все входные массивы одного размера nxn.