0

Windows で QtCreator を使用していますが、コンパイラで出力を最適化する方法を知りたいです。

私の理解では、MinGW は GCC のポートです。したがって、 -O2などの引数を使用できるはずです。ただし、「プロジェクト」バーに表示されるのは次のとおりです。

  • qmake のビルド手順 (おそらくここにはありません。qmake は .pro ファイル / MOC / Qt に関するものです ...)
  • mingw32-make のビルド手順 (おそらく)
  • きれいなステップ(おそらくそうではない)

そこで、「引数の作成」ボックスに -O2 を追加しようとしましたが、残念ながら「無効なオプション --O」というエラーが表示されます。


興味のある人のために、私はそれを読んだので、アッカーマン関数の実装を作ろうとしていました:

アッカーマン関数は、非常に深い再帰の観点から定義されているため、再帰を最適化するコンパイラーの能力のベンチマークとして使用できます。

コード(実際にはQtを使用していません):

#include <QtCore/QCoreApplication>
#include <QDebug>
#include <ctime>

using namespace std;

int nbRecursion;
int nbRecursions9;

int Ackermann(int m, int n){
    nbRecursion++;
    if(nbRecursion % 1000000 == 0){
        qDebug() << nbRecursions9 << nbRecursion;

    }
    if(nbRecursion == 1000000000){
        nbRecursion = 0;
        nbRecursions9++;
    }

    if(m==0){
        return n+1;
    }
    if(m>0 && n>0){
        return Ackermann(m-1,Ackermann(m, n-1));
    }
    if(m>0 && n==0){
        return Ackermann(m-1,1);
    }
    qDebug() << "Bug at " << m << ", " << n;

}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    nbRecursion = 0;
    nbRecursions9 = 0;

    int m = 3;
    int n = 13;

    clock_t begin = clock();
    Ackermann(m,n);
    clock_t end = clock();
    double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;

    qDebug() << "There are " << CLOCKS_PER_SEC << " CLOCKS_PER_SEC";
    qDebug() << "There were " << nbRecursions9 << nbRecursion << " recursions in " << elapsed_secs << " seconds";

    double timeX = 1000000000.0*((elapsed_secs)/(double)nbRecursion);
    if(nbRecursions9>0){
        timeX += elapsed_secs/(double)nbRecursions9;
    }

    qDebug() << "Time for a function call : " << timeX   << " nanoseconds";

    return a.exec();
}
4

1 に答える 1

2

-O2リリースビルドを行うときにデフォルトで使用されます。デバッグビルドのみが最適化を使用しません。とにかく、特定のコンパイラオプションを使用する場合は、プロジェクトファイル(*.pro)自体で、QMAKE_CFLAGS_RELEASE(Cファイルの場合)およびQMAKE_CXXFLAGS_RELEASE(C ++ファイルの場合)にオプションを追加することによって使用します。例えば:

QMAKE_CFLAGS_RELEASE += -O3 -march=i686 -mtune=generic -fomit-frame-pointer
QMAKE_CXXFLAGS_RELEASE += -O3 -march=i686 -mtune=generic -fomit-frame-pointer

デバッグビルドかリリースビルドかに関係なく、特定のオプションを常に使用したい場合はQMAKE_CFLAGSQMAKE_CXXFLAGS代わりにに追加してください。ただし、通常、リリースビルドには最適化オプションのみが必要であり、デバッグオプションは必要ありません。

于 2012-11-02T13:20:40.707 に答える