2011-02-23 86 views
0

我有以下代碼段。對於大小爲176000的矢量,循環最多需要8分鐘才能執行。我不知道什麼是採取了這麼多時間性能調整

XEPComBSTR bstrSetWithIdsAsString; //Wrapper class for BSTR 
    std::vector<__int64>::const_iterator it; 
    for(it = vecIds.begin(); 
     it != vecIds.end(); 
     it++) 
    { 

        __int64 i64Id = (*it); 
        __int64 i64OID = XPtFunctions::GetOID(i64Id); 

        // set ',' between two set members 
        if (it != vecIds.begin()) 
         bstrSetWithIdsAsString.Append(XEPComBSTR(L",")); 
         wchar_t buf[20]; 
     _i64tow_s(i64OID, buf, 20, 10); 
     bstrSetWithIdsAsString.Append(buf); 
    } 


__int64 GetOID(const __int64 &i64Id) 
{ 
    __int64 numId = i64Id; 
    numId <<= 16; 
    numId >>= 16; 
    return numId; 
} 
+1

我通常會介紹一個程序,以確定它爲什麼不執行,因爲我認爲它應該... – justin 2011-02-23 12:16:16

+1

8分鐘在哪種情況下?你是否在編譯優化?您使用的是哪種編譯器,對於MSVC,您是否禁用了Secure STL功能? – jalf 2011-02-23 12:19:39

+0

@jalf沒有優化設置。我正在使用VC9 – 2011-02-23 12:26:02

回答

1

只有這樣,才能找出佔用了這麼長的時間是分析的應用程序。某些版本的Visual Studio附帶了一個功能完備的分析器。

或者,只需在調試器中運行該程序,並以隨機間隔分解它,然後記下代碼中的位置。

但我可以看到一些潛在的故障點:

  • 你執行了很多字符串的追加。他們每次都分配新的內存嗎?您的字符串類型是否允許您預先保留內存,例如std::string可以做什麼?一般來說,字符串類是否有效?
  • 你循環迭代器,並給出你可能使用的可怕的匈牙利符號,我假設你正在使用Windows,可能使用MSVC。除非明確禁用它,否則即使在發佈版本中,MSVC的某些版本也會啓用大量STL迭代器的運行時檢查。 VS2005和2008特別對此感到愧疚。 2010僅在調試模式下啓用此檢查。
  • 當然,你建立啓用優化,對不對?

但我只是指出看起來像什麼可能減慢你的代碼。我不知道究竟是發生了什麼。可以肯定的是,我不得不剖析你的代碼。你可以做到這一點。我不能。這樣做。

2

我認爲你的瓶頸是Append功能。你看,這個字符串裏面有一些分配的內存,當你嘗試附加一些不適合的東西時,它會重新分配更多的內存,這會花費很多時間。嘗試在開始時分配一次所需的內存。 HTH

1

我不知道這是什麼東西做的: bstrSetWithIdsAsString.Append(buf);

,但我想這就是緩慢,特別是當它通過尋找到哪裏工作緩衝區的結束是每次第一個零字節,可能需要做很多重新分配。

爲什麼不使用wostringstream?