Я изо всех сил пытаюсь понять вывод, который я получаю от gprof .
У меня есть простой класс-оболочка для двумерного массива, который должен быть непрерывным в памяти.
Его конструктор и метод, который я использую для доступа к значениям:
Array2d::Array2d(int size, double initialValue)
: mSize(size) {
data = new double *[size];
data[0] = new double[size * size];
for (int i = 1; i < size; ++i) {
data[i] = data[0] + i * size;
}
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
data[i][j] = initialValue;
}
}
}
double &Array2d::operator()(int i, int j) {
return data[i][j];
}
В числовом коде, над которым я работаю, это один вывод, полученный из gprof:
% cumulative self self total
time seconds seconds calls ms/call ms/call name
49.33 34.80 34.80 43507867293 0.00 0.00 Array2d::operator()(int, int)
18.05 47.53 12.73 jacobi(Array2d&, Array2d&, int, int, double, double, double, int)
Я удивлен, увидев, что почти 50% времени работы тратится на доступ к значениям из массива.
Этот класс Array2d заменил использование std::vector<double>
, что было намного быстрее.
Что я здесь не понимаю?