скорость работы с динамическим массивом и std::vector

программировал умножение матрицы на вектор, и заметил что умножение с использованием простых динамических массивов выполняется в два раза быстрее в среднем чем с использованием std::vector, с чем это связано? ведь проверки на выход за пределы массив нет, вроде бы и оверхеда нет никакого почти значительного по сравнению с массивами, почему все-таки столь различное время работы

#include <iostream>
#include <vector>
#include <ctime>

//#include <omp.h>


void fillVector(std::vector<int>& vector)
{
  for (int i = 0;i < vector.size();++i) {
    vector[i] = rand() % 10;
  }
}

void fillMatrix(std::vector<std::vector<int>>& matrix)
{
  for (int i = 0;i < matrix.size();++i) {
    for (int j = 0;j < matrix[i].size();++j) {
      matrix[i][j] = rand() % 10;
    }
  }
}

void matmul(const std::vector<std::vector<int>>& matrix,
  const std::vector<int>& vector, std::vector<int>& result)
{
//#pragma omp parallel for
  for (int i = 0;i < matrix.size();++i) {
    result[i] = 0;
    for (int j = 0; j < matrix[i].size(); ++j) {
      result[i] += matrix[i][j] * vector[j];
    }
  }
}

void fillVector(int* vector, const int n)
{
  for (int i = 0;i < n;++i) {
    vector[i] = 1 + rand() % 10;
  }
}

void fillMatrix(int** matrix, const int n, const int m)
{
  for (int i = 0;i < n;++i) {
    for (int j = 0;j < m;++j) {
      matrix[i][j] = 1 + rand() % 10;
    }
  }
}

void matmul(int** matrix, int* vector, int* result, const int n, const int m)
{
//#pragma omp parallel for
  for (int i = 0;i < n;++i) {
    result[i] = 0;
    for (int j = 0; j < m; ++j) {
      result[i] += matrix[i][j] * vector[j];
    }
  }
}

int main()
{
  const int n = 15000;
  const int m = 15000;

  std::vector<std::vector<int>> matrix(n, std::vector<int>(m));
  std::vector<int> vector(m);
  std::vector<int> result(n);

  fillVector(vector);
  fillMatrix(matrix);

  clock_t startTime = clock();
  matmul(matrix, vector, result);
  clock_t endTime = clock();
  std::cout << endTime - startTime << "msec\n";

  int* vector1 = new int[m];
  int** matrix1 = new int* [n];
  for (int i = 0;i < n;++i) {
    matrix1[i] = new int[m];
  }
  int* result1 = new int[n];

  fillVector(vector1, m);
  fillMatrix(matrix1, n, m);

  startTime = clock();
  matmul(matrix1, vector1, result1, n, m);
  endTime = clock();
  std::cout << endTime - startTime << "msec\n";

  delete[] result1;
  delete[] vector1;
  for (int i = 0;i < n;++i) {
    delete[] matrix1[i];
  }
  delete[] matrix1;

  return 0;
}

Ответы (1 шт):

Автор решения: pepsicoca1

Было похожее обсуждение:

Перебор элементов контейнера - очень медленная операция

Мой ответ там заминусовали, но тем не менее... :-)

Еще страшная история из прошлого:

Грабли: gcc 4.8.1 не соответствует C++ 11

→ Ссылка