скорость работы с динамическим массивом и 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
→ Ссылка
Было похожее обсуждение:
Перебор элементов контейнера - очень медленная операция
Мой ответ там заминусовали, но тем не менее... :-)
Еще страшная история из прошлого: