所以,我正在编写(或已经编写)用于在北美绘制电源频率的轮廓映射应用程序,它的工作原理非常好......在Linux上。我在循环上运行它来更新bmp映射文件,我最终将在网站上输出。它可以在大约3秒内运行和更新,这对我来说很好。当我尝试将应用程序移植到Windows时出现问题。我将代码移动到Visual Studios 2012中。链接库,编译等等,我不得不忽略一些关于浮点数到整数转换的警告,但我得到了它的工作。
然后,我跑了,它似乎没有做任何事情。但是,在添加了一些输出命令之后,我意识到它是做某事,它只是比Linux可执行文件慢100倍!我的意思是,诚然,代码非常密集(大约400,000次迭代),但这太荒谬了。
我看到很多关于VS在调试模式下运行缓慢的其他主题,但即使在我编译并运行可执行文件后,它仍然一样慢。
以下是相关代码,如果您有任何想法,请与我们联系。你不会认识到的一些功能,因为它们与性能无关(我只称它们一次,我知道它们不是速度问题的根源)或者它们来自Easy BMP库我是用于图像处理。现在,我已将它设置为输出100X100图像,但最初我输出的是800x500像素图像:
float get_value(int x, int y, int dataNum, vector<vector<float> > data)
{
vector<float> distance;
float value=0; float distanceTotal = 0;
for(int i=0; i<dataNum; i++)
{
distance.push_back(sqrt(pow(data[0][i]-x,2) + pow(data[1][i]-y,2)));
if(distance[i] < 2)
return 0;
distance[i] = 1/pow(distance[i],3);
distanceTotal+=distance[i];
}
for(int i=0; i<dataNum; i++)
{
value+=distance[i]/distanceTotal*data[2][i];
}
return value;
}
int _tmain(int argc, _TCHAR* argv[])
{
//set image attributes
int height=100; int width = 100; int colorScale = 5*255; string dataFile = "data2.txt";
//get data and colormap
vector<vector<float> > data = getData(dataFile, width, height);
vector<RGBApixel> colorMap = makeColorMap(colorScale);
int dataNum = data[0].size();
pair<float,float> range = make_pair(*min_element(data[2].begin(),data[2].end()),*max_element(data[2].begin(),data[2].end()));
//make image
BMP newMap;
newMap.SetBitDepth(16);
newMap.SetSize(width,height);
for(int x=0; x<width; x++)
{
for(int y=0; y<height; y++)
{
//for debug purposes
cout << x << " " << y << endl;
float value = get_value(x,y,dataNum,data);
//get color value based on data value
int colorValue = floor((value-range.first)/(range.second-range.first)*colorScale);
//handle border cases
if(colorValue < 0 )
colorValue=0;
else if(colorValue > colorScale-1)
colorValue=colorScale-1;
newMap.SetPixel(x,y,colorMap[colorValue]);
}
}
newMap.WriteToFile("map.bmp");
return 0;
}
有什么想法吗?
谢谢!