我想了解爲什麼使用-O2 -march = native與GCC給出比不使用它們慢的代碼。 請注意,我的Windows 7「壞」GCC優化性能
這裏下使用的MinGW(GCC 4.7.1)是我的代碼:
struct.hpp:
#ifndef STRUCT_HPP
#define STRUCT_HPP
#include <iostream>
class Figure
{
public:
Figure(char *pName);
virtual ~Figure();
char *GetName();
double GetArea_mm2(int factor);
private:
char name[64];
virtual double GetAreaEx_mm2() = 0;
};
class Disk : public Figure
{
public:
Disk(char *pName, double radius_mm);
~Disk();
private:
double radius_mm;
virtual double GetAreaEx_mm2();
};
class Square : public Figure
{
public:
Square(char *pName, double side_mm);
~Square();
private:
double side_mm;
virtual double GetAreaEx_mm2();
};
#endif
struct.cpp:
#include <cstdio>
#include "struct.hpp"
Figure::Figure(char *pName)
{
sprintf(name, pName);
}
Figure::~Figure()
{
}
char *Figure::GetName()
{
return name;
}
double Figure::GetArea_mm2(int factor)
{
return (double)factor*GetAreaEx_mm2();
}
Disk::Disk(char *pName, double radius_mm_) :
Figure(pName), radius_mm(radius_mm_)
{
}
Disk::~Disk()
{
}
double Disk::GetAreaEx_mm2()
{
return 3.1415926*radius_mm*radius_mm;
}
Square::Square(char *pName, double side_mm_) :
Figure(pName), side_mm(side_mm_)
{
}
Square::~Square()
{
}
double Square::GetAreaEx_mm2()
{
return side_mm*side_mm;
}
main.cpp
#include <iostream>
#include <cstdio>
#include "struct.hpp"
double Do(int n)
{
double sum_mm2 = 0.0;
const int figuresCount = 10000;
Figure **pFigures = new Figure*[figuresCount];
for (int i = 0; i < figuresCount; ++i)
{
if (i % 2)
pFigures[i] = new Disk((char *)"-Disque", i);
else
pFigures[i] = new Square((char *)"-Carré", i);
}
for (int a = 0; a < n; ++a)
{
for (int i = 0; i < figuresCount; ++i)
{
sum_mm2 += pFigures[i]->GetArea_mm2(i);
sum_mm2 += (double)(pFigures[i]->GetName()[0] - '-');
}
}
for (int i = 0; i < figuresCount; ++i)
delete pFigures[i];
delete[] pFigures;
return sum_mm2;
}
int main()
{
double a = 0;
StartChrono(); // home made lib, working fine
a = Do(10000);
double elapsedTime_ms = StopChrono();
std::cout << "Elapsed time : " << elapsedTime_ms << " ms" << std::endl;
return (int)a % 2; // To force the optimizer to keep the Do() call
}
予兩次編譯該代碼:
1:無優化
的mingw32-G ++ EXE -Wall -fexceptions -std = C++ 11 -c的main.cpp -o主。 ø
的mingw32-G ++。EXE -Wall -fexceptions -std = C++ 11 -c struct.cpp -o struct.o
的mingw32-G ++。EXE -o的Program.exe main.o結構。 o -s
2:和-O2優化
的mingw32-G ++ EXE -Wall -fexceptions -O2 -march =天然-std = C++ 11 -c的main.cpp -o main.o
的mingw32 -g ++ .exe -Wall -fexceptions -O2 -march = native -std = C++ 11 -c struct.cpp -o struct.o
mingw32-g ++。exe -o program.exe main.o struct。 ø-s
1:執行時間:
1196毫秒(毫秒1269與Visual Studio 2013)
2:執行時間:
1569毫秒(403毫秒與Visual Studio 2013)!!!!!!!!!!!!!
使用-O3代替-O2不會改善結果。 我當時還是很確信GCC和Visual Studio是等價的,所以我不明白這個巨大的差別。 另外,我不明白爲什麼優化後的版本比使用GCC的非優化版本要慢。
我想念這裏的東西嗎? (請注意,我有與真正的GCC 4.8相同的問題。2在Ubuntu)
感謝您的幫助
[OT]:在構造函數中使用const char *而不是將'const char *'強制轉換爲'char *'。 – Jarod42
'sprintf(name,pName);'很危險...... – Jarod42
謝謝,我完全意識到這一點,因此,沒有任何藉口:) –