Shared_Ptr影响应用程序的性能

Shared_Ptr eates the performance of my application

本文关键字:性能 应用程序 影响 Ptr Shared      更新时间:2023-10-16

我在Ubuntu上,我正在开发一个计算机视觉应用程序(光流),我正在使用valgrind对代码进行一些分析。在分析之后,我发现shared_ptr占用了应用程序的74%。请找到附件的代码,其中shared_ptr是使用的。我在寻找一种优化方法。除此之外,sprintf也花费了很多时间,openMP线程也消耗了很多时间。我真的很想知道sprint和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) ) );

}

我怀疑shared_ptr是罪魁祸首,但newdelete是。

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

正如@nvoigt已经建议的那样,使用一个自动对象

CharachterDetection item(frame);

并将item->的访问权限改为item.

在你的图片中,位置是/usr/arm-linux-gnueabihf/...。如果这不是本机运行,而是在模拟虚拟机上运行,我不会依赖任何结果。

:

在循环中运行sprintf并重复复制路径,然后再次将其放入QString中。也许使用QString::arg更合适。

也许你的帖子中缺少一些代码?您的共享指针似乎不做任何事情,但构造和删除您的对象。如果需要该对象的构造函数代码,则可以将该对象放到堆栈中:

// ----------------------- Perform Marker Detection ------------------------
ZtAbsoluteSystemItem item(frame);

很难从您的代码中判断出问题的确切位置,因此我只能提供两个我在过去发现有用的一般建议:

  • 避免手动使用new,查看std::make_shared以使分配更有效。避免无用的引用计数。当接受一个为std::shared_ptr的参数时,将其作为const std::shared_ptr<...>&,而不是创建一个std::shared_ptr的副本,这意味着每个函数调用都有一个原子的自增和自减。