1

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

有什么想法吗?

谢谢!

4

0 回答 0