2011-08-31 73 views
2

我正在分析MSVC 2005中的調試生成C++代碼,並且某些代碼在發佈時與(1-2秒)相比需要很長時間才能執行(30+秒) 。MSVC2005 std :: _ Iterator_base ::函數調試速度慢

我已經在編譯器選項(/ D _SECURE_SCL = 0)中將_SECURE_SCL設置爲0,並在源代碼中將其設置爲零。

我抄頂消費者分析器(AMD CodeAnalyst)

  • 的std :: _ Iterator_base :: _ Orphan_me 19.74
  • 的std :: _ Iterator_base :: _採用9.57
  • 的std :: _ Iterator_base ::運算= 8.98
  • 的std :: _ Iterator_base ::〜_Iterator_base 8.55
  • 的std :: _ Iterator_base :: _ Iterator_base 7.37

試圖調試代碼,並不得不等待30多秒,每次有點吮吸,有什麼我在這裏失蹤?

UPDATE: 結束語#pragma optimize()周圍的類方法並沒有做太多,但定義/D _HAS_ITERATOR_DEBUGGING=0將它推倒,釋放速度,這些現在我的首要探查命中(這似乎是正常的功能):

  • 的std :: _ Vector_const_iterator> ::運算++ 29.79
  • 的std :: _ Vector_const_iterator> ::運算++ 26.26
  • 的std :: _ Vector_const_iterator> ::運算符* 25.74

3種功能,60條指令,共計:2666個樣本,顯示樣本的81.78%,總會話樣品

感謝您的快速答覆的2.76%!

回答

4

如果您關心調試性能,還應該禁用_HAS_ITERATOR_DEBUGGING。當啓用迭代器調試時,會執行大量簿記來幫助您檢測代碼中使用無效迭代器或未能正確管理容器和迭代器生命週期的代碼中的錯誤。

也就是說,檢查調試版本和優化版本版本之間的30:1性能差異聽起來很典型和合理。

+0

由於您使用的是舊版本的Visual C++,請注意,禁用迭代器調試在舊版本中是相當麻煩的(例如,['ostringstream' is broken](http://connect.microsoft。COM/VisualStudio中/反饋/信息/ 435483 /禁用,具有迭代器調試死因內存腐敗,在調試模式與 - ostringstream))。這些bug中的大多數都是在VS2008或VS2010中修復的(當然,那些影響到我寫的代碼的惡意代碼已經修復)。 –

0

看看這裏的一些答案:How to make MSVC debug builds run faster

除了@James提到的_HAS_ITERATOR_DEBUGGING = 0之外,似乎還有一個巧妙的技巧,它可以切換#pragma optimize("", off)/#pragma optimize("", on)來禁用單個函數/代碼塊的優化等。如果您只想在特定代碼段內進行調試,則禁用對於這件作品的優化可能比將全局優化轉化爲更快。

希望這會有所幫助。

+0

我會在將來使用時記住這一點,但這次似乎沒有幫助我的情況。 –