2011-02-23 69 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?