0

私は Ubuntu を使用しており、コンピューター ビジョン アプリケーション (オプティカル フロー) に取り組んでおり、valgrind を使用してコードのプロファイリングを行っています。プロファイリングの結果、shared_ptr がアプリケーションの 74% を占めていることがわかりました。shared_ptr が使用されている添付コードを見つけてください。そのための最適化を探しています。その上、sprintf も非常に時間がかかり、openMP スレッドも大量に消費します。私はスプリントとopenMPのコストについて本当に疑問に思っています...

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


    omp_set_dynamic( 0 );
    omp_set_num_threads( 4 );

    double t1, t2;

    // ------------- Initialization: Frames. --------------

    // Load first image
    char imFName[1024];
    sprintf( imFName, "%s/img_%08i.png", imPath.c_str(), imIndex );
    ifstream fileExists( imFName );

    if (!fileExists)
    {
        printf("First image %s/img_%08i.png could not be loaded!", imPath.c_str(), imIndex);
        return -1;
    }

    QImagePtr prevImg;
    QImagePtr curImg( new QImage( QString(imFName) ) );



}
4

3 に答える 3

3

shared_ptrそれが犯人だとは思えませんが、newdelete.

ヒープにメモリを割り当てて割り当てitem、for ループのスコープが終了すると解放します。だからあなたは高価なヌープを持っています.

@nvoigt が既に提案したように、自動オブジェクトを使用します

CharachterDetection item(frame);

アクセスを からitem->に変更しitem.ます。

写真では、場所は/usr/arm-linux-gnueabihf/...です。これがネイティブの実行ではなく、シミュレートされた仮想マシンでの実行である場合、私は結果に依存しません。

更新

ループで sprintf を実行し、パスを繰り返しコピーしてから、再度 QString に入れます。おそらく、いずれかを使用するQString::arg方が適しています。しかし、これは単なる推測です。

于 2013-03-11T10:26:31.147 に答える
2

投稿のコードが不足している可能性がありますか?あなたの共有ポインタは、オブジェクトを構築して削除する以外は何もしていないようです。上記のオブジェクトのコンストラクター コードが必要な場合は、オブジェクトをスタックに置くことができます。

// ----------------------- Perform Marker Detection ------------------------
ZtAbsoluteSystemItem item(frame);
于 2013-03-11T10:27:43.677 に答える
0

あなたのコードから問題がどこにあるのかを正確に判断するのは難しいので、私が過去に役立つと思った 2 つの一般的なアドバイスしか提供できません。

  • new手動での使用は避け、std::make_shared割り当てをより効率的にするために調べてください。
  • 無駄な参照カウントを避ける。であるパラメーターを取得するときは、関数呼び出しごとにアトミックなインクリメントとデクリメントを意味するのコピーを作成する代わりに、std::shared_ptrそれを取得します。const std::shared_ptr<...>&std::shared_ptr
于 2013-03-11T10:40:36.807 に答える