我注意到,我的升压mutiarrays进行了比较,STL矢量进行得很厉害。 我来到这个问题刚才问,哪里最喜欢回答说,
1)升压几乎是一样快天然阵列
2)你需要改变你访问你的数据元素,以获得最佳性能加速的MultiArray的顺序。 另外,你需要在发行模式下运行,并且不能进行调试。
好了,我做过的一切,可是我的MultiArrays的性能是相当寒酸。
我在这里发布我的代码:
a)用默认排序
#include <windows.h>
#define _SCL_SECURE_NO_WARNINGS
#define BOOST_DISABLE_ASSERTS
#include <boost/multi_array.hpp>
#include <stdio.h>
#include <conio.h>
#include <iostream>
int main(int argc, char* argv[])
{
const int X_SIZE = 400;
const int Y_SIZE = 400;
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;
}
B)具有倒订购
#include <windows.h>
#define _SCL_SECURE_NO_WARNINGS
#define BOOST_DISABLE_ASSERTS
#include <boost/multi_array.hpp>
#include <stdio.h>
#include <conio.h>
#include <iostream>
int main(int argc, char* argv[])
{
const int X_SIZE = 400;
const int Y_SIZE = 400;
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 x = 0; x < X_SIZE; ++x)
{
for (int y = 0; y < Y_SIZE; ++y)
{
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 x = 0; x < X_SIZE; ++x)
{
for (int y = 0; y < Y_SIZE; ++y)
{
nativeMatrix[x + (y * X_SIZE)] *= 2.345;
}
}
}
endTime = ::GetTickCount();
printf("[Native]Elapsed time: %6.3f seconds\n", (endTime - startTime) / 1000.0);
return 0;
}
在每一个可能的排列,我的基准是大致相同的:
1)本机代码:0.15秒
2)对于升压的MultiArray:1.0秒
我使用Visual Studio 2010。
我的问题是:因为我使用Visual Studio中,如何从加速的MultiArrays不错的表现?
更新:
我切换到Visual Studio 2013年在那里,我启用了Qvec-报告2编译器开关。 而且很有意思的是,当我编译,我开始收到信息消息说,编译器无法量化。 下面是它看起来几乎就像一个警告的样本信息的消息。 我接到好几个这样的消息对于最简单的代码。
---分析函数:void __cdecl`矢量构造器游标'(无效* __ptr64,无符号__int64,整型,无效* __ptr64(__cdecl *)(无效* __ptr64))1> d:\工作区\测试\废料\废料\源的.cpp:信息C5002:循环不矢量由于原因“1301”
我认为这是一个重大线索,为什么升压的MultiArrays是在我的Visual Studio执行速度较慢,而他们在GCC好吗执行。 鉴于这种额外的信息,可以请你想办法来解决这个问题?
@Admins:如前面回答请取消标记我的问题。 我已经作出了重大修改。