2013-03-11 76 views
0

我在Ubuntu上,我正在研究計算機視覺應用程序(光學流程),並且正在使用valgrind對代碼進行分析。 分析後,我發現shared_ptr佔據了應用程序的74%。請在附件中找到使用shared_ptr的代碼。我正在尋找一個優化。除此之外,sprintf也花費了很多時間,而openMP線程也吃了很多。我真的想知道sprinft,和OpenMP成本...Shared_Ptr我的應用程序的性能

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))); 



} 
+0

這並不足以讓我們做任何事情。 「ZtAbsoluteSystemItem」是做什麼的? – 2013-03-11 10:25:31

+1

要了解shared_ptr是否是問題,請將分析結果與本機指針和unique_ptr進行比較。 – 2013-03-11 10:27:34

+0

@TonyTheLion只是初始化攝像頭參數。 – Andre 2013-03-11 10:28:57

回答

3

我懷疑shared_ptr是罪魁禍首,但newdelete

您在堆上分配內存,將其分配給item,並且for循環的作用域結束時釋放它。所以你有一個昂貴的noop。

作爲@nvoigt已經建議,使用自動對象

CharachterDetection item(frame); 

和更改存取從item->item.

在你的圖片中,位置是/usr/arm-linux-gnueabihf/...。如果這不是本地運行,而是在模擬虛擬機上,我不會依賴任何結果。

更新

您運行在一個循環sprintf和反覆拷貝的路徑,之後把它放在一個QString的一次。也許使用QString::arg之一更適合。但這只是一個猜測。

+0

所以我應該怎麼做才能解決這個問題?只是分配在堆棧上? – Andre 2013-03-11 10:35:50

+0

@Mahmoud是的,如果你的對象不是太大,這將是正確的修復。 – 2013-03-11 10:38:46

+0

你也有一個想法,爲什麼sprintf需要很多時間? – Andre 2013-03-11 10:40:59

2

也許你在你的文章中缺少一些代碼?你的共享指針似乎沒有做任何事情,只是構建和刪除你的對象。如果需要說對象的構造函數的代碼,你可以只是把對象在棧上:

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

我發佈了完整的代碼和分析器圖像 – Andre 2013-03-11 10:36:06

+0

我還不清楚你爲什麼使用shared_ptr而不是將對象放在堆棧上。它對於堆棧來說太大了嗎,還是我錯過了將代碼插入跨循環生命週期的某個容器的代碼的一部分? – nvoigt 2013-03-11 10:49:34

0

很難從你的代碼究竟在何處的問題,就是要告訴,所以我只能提供建議的兩種通用件我發現過去很有用:

  • 避免手動使用new,查看std::make_shared以使分配更有效。
  • 避免無用的參考計數。當參數爲std::shared_ptr時,請將其作爲const std::shared_ptr<...>&,而不是創建std::shared_ptr的副本,這意味着每個函數調用的原子增量和減量。