所以,我正在编写(或已经编写)一个用于绘制北美电源频率的等高线映射应用程序,它工作得非常好......在 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;
}
有什么想法吗?
谢谢!