0

我在 Ubuntu 上,我正在开发一个计算机视觉应用程序(光流),我正在使用 valgrind 对代码进行一些分析。分析后,我发现 shared_ptr 占用了 74% 的应用程序。请找到使用 shared_ptr 的附加代码。我正在为此寻找优化。除此之外,sprintf 也很耗时,openMP 线程也很吃力。我真的很想知道 sprintft 和 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是罪魁祸首,但是newand delete.

您在堆上分配内存,将其分配给item,当 for 循环的范围结束时,它会释放它。所以你有一个昂贵的noop。

正如@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

从你的代码中很难判断问题到底出在哪里,所以我只能提供两条我过去发现有用的一般建议:

  • 避免new手动使用,考虑std::make_shared使分配更有效。
  • 避免无用的引用计数。当采用 a 参数时std::shared_ptr,将其视为const std::shared_ptr<...>&而不是创建 a 的副本,std::shared_ptr这意味着每个函数调用的原子增量和减量。
于 2013-03-11T10:40:36.807 回答