Windows .exe比Linux Executable慢得多

时间:2013-07-02 20:41:01

标签: c++ linux windows performance visual-studio

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

有什么想法吗?

谢谢!

0 个答案:

没有答案