2016-01-15 103 views
1

根據這裏和別處發現的帖子,我試圖通過設置_NO_DEBUG_HEAP_SECURE_SCL_HAS_ITERATOR_DEBUGGING符號來加速VS 2012調試(本地C++,STL)。在VS 2012中調試STL

沒有運氣。

我寫了一個最基本的測試程序,它解析一個大的文本文件(100,000行,100列),並...

輸出在釋放模式:在調試模式下

 read 102595 lines in 6.051 seconds 

輸出:

 read 102595 lines in 317.979 seconds <== 50x slower, ouch !!! 

下面是完整的源代碼(C++控制檯應用程序,沒有預編譯頭)。 #define語句沒有任何作用。調試速度仍然難以忍受。有什麼建議麼?

// testAppDebugSTL.cpp : Defines the entry point for the console application. 
// 

#ifdef _DEBUG 
    #define _SECURE_SCL    0 
    #define _HAS_ITERATOR_DEBUGGING 0 
    #define _NO_DEBUG_HEAP   1 
#endif 

#include <string> 
#include <vector> 
#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <sstream> 

int main(int argc, char** argv[]) 
{ 

    std::ifstream       f ("c:\\temp\\largeFile.csv"); 
    std::vector<std::string>    lines; 
    std::vector<std::vector<std::string> > tokenized_lines; 
    size_t         num_lines = 0; 

    clock_t tBeg = clock(); 
    while(!f.eof()) 
    { 
     std::string line; 
     std::getline(f, line); 
     if (!f.eof()) 
     { 
      lines.push_back(line); num_lines++; 
      std::stringstream  ss(line); 
      std::string    token; 
      std::vector<std::string> tokens; 
      while (std::getline(ss, token, ',')) 
      { 
       tokens.push_back(token); 
      } 
      tokenized_lines.push_back(tokens); 
     } 
    } 
    clock_t tEnd = clock(); 
    std::cout << "read " << num_lines << " lines in " << double(tEnd - tBeg)/CLOCKS_PER_SEC << " seconds"; 

    return 0; 
} 
+1

你怎麼知道他們沒有任何效果?沒有這些定義你有沒有做過測量?無論如何,調試版本總是比發佈版本要慢很多。 – antred

+3

我有調試版本運行速度慢100倍,但歸咎於缺乏小函數內聯。 –

+5

建議:不要嘗試優化調試模式,而是在發佈模式下啓用調試信息。 –

回答

1

更改發佈模式以輸出調試符號。首先調試一個優化的發佈版本有點奇怪,但你會習慣它(閱讀一些彙編程序的能力有所幫助)。

還記得先在小數據集上運行測試。

+0

由於var的優化不太理想,儘管我收集到了更新的VS版本有一些額外的功能,用於調試VS 2012中缺少的優化版本。但仍然是一個不錯的選擇。通過試驗和錯誤發現,通過簡單地將[C/C++ ...代碼生成...基本運行時檢查]設置爲「/ Default」,該測試程序將在調試模式下加速10倍。似乎也加快了/ MDd到/ MD(但不知道這是個好主意)。 – tpascale