Я пытаюсь сравнить производительность boost:: multi_array с родными динамически распределенными массивами со следующей тестовой программой:
#include <windows.h>
#define _SCL_SECURE_NO_WARNINGS
#define BOOST_DISABLE_ASSERTS
#include <boost/multi_array.hpp>
int main(int argc, char* argv[])
{
const int X_SIZE = 200;
const int Y_SIZE = 200;
const int ITERATIONS = 500;
unsigned int startTime = 0;
unsigned int endTime = 0;
// Create the boost array
typedef boost::multi_array<double, 2> ImageArrayType;
ImageArrayType boostMatrix(boost::extents[X_SIZE][Y_SIZE]);
// Create the native array
double *nativeMatrix = new double [X_SIZE * Y_SIZE];
//------------------Measure boost----------------------------------------------
startTime = ::GetTickCount();
for (int i = 0; i < ITERATIONS; ++i)
{
for (int y = 0; y < Y_SIZE; ++y)
{
for (int x = 0; x < X_SIZE; ++x)
{
boostMatrix[x][y] = 2.345;
}
}
}
endTime = ::GetTickCount();
printf("[Boost] Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
//------------------Measure native-----------------------------------------------
startTime = ::GetTickCount();
for (int i = 0; i < ITERATIONS; ++i)
{
for (int y = 0; y < Y_SIZE; ++y)
{
for (int x = 0; x < X_SIZE; ++x)
{
nativeMatrix[x + (y * X_SIZE)] = 2.345;
}
}
}
endTime = ::GetTickCount();
printf("[Native]Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
return 0;
}
Получаю следующие результаты:
[Boost] Elapsed time: 12.500 seconds
[Native]Elapsed time: 0.062 seconds
Я не могу поверить, что multi_arrays намного медленнее. Может ли кто-нибудь определить, что я делаю неправильно?
Я предполагаю, что кэширование не является проблемой, поскольку я выполняю запись в память.
EDIT: Это была отладочная сборка. Per Laserallan предположил, что я сделал сборку релизов:
[Boost] Elapsed time: 0.266 seconds
[Native]Elapsed time: 0.016 seconds
Гораздо ближе. Но от 16 до 1 мне все равно кажется.
Ну, нет окончательного ответа, но я собираюсь перейти и оставить свой настоящий код с родными массивами на данный момент.
Принятие ответа Laserallan, потому что это был самый большой недостаток в моем тесте.
Спасибо всем.