Shared_Ptr影响应用程序的性能
Shared_Ptr eates the performance of my application
我在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
是罪魁祸首,但new
和delete
是。
在堆上分配内存,将其分配给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
的副本,这意味着每个函数调用都有一个原子的自增和自减。
相关文章:
- Linux VM(重型多线程应用程序)的性能改进
- 运行最基本的SFML应用程序时的性能
- 在GO应用程序中使用C( )进行性能
- 谷歌性能工具可以用于分析C应用程序吗?
- 堆栈保留大小和堆栈提交大小的增加会提高应用程序性能吗
- 用于C++和性能关键型应用程序中的循环
- 对于高度优化的矩阵多应用程序代码,MSVC和GCC之间的性能差异
- 基于libpcap的应用程序是否会影响网络速度/性能
- 编译提升::数学的性能测试应用程序
- 嵌套函数或方法调用会降低应用程序的性能
- 适用于Android的纯c ++应用程序及其性能
- 当从应用程序多次调用数据库过程时,性能是否会受到影响
- 实时音频应用程序,提高性能
- 提高应用程序性能的简单方法
- 在Windows Kinect应用程序中使用c++和c#有什么不明显的区别吗?(例如,性能、特性)
- 相同的 Direct2D 应用程序在"slower"计算机上的性能更好
- cocoa是否限制了C/ c++ openGL应用程序的整体性能?
- Shared_Ptr影响应用程序的性能
- 在非托管c++应用程序中提高WPF对话框的性能
- 提高Windows应用程序的性能