性能调整

时间:2011-02-23 12:11:34

标签: c++ optimization

我有以下代码段。对于大小为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;
}

3 个答案:

答案 0 :(得分:2)

我认为你的瓶颈是Append功能。你看,字符串里面有一些分配的内存,当你尝试追加一些不适合的东西时,它会重新分配更多的内存,这需要花费很多时间。尝试在开始时分配一次必要的内存。 HTH

答案 1 :(得分:1)

找出所有这些内容的唯一方法是分析应用程序。某些版本的Visual Studio配有功能齐全的分析器。

或者,只需在调试器中运行程序,并以随机间隔对其进行分解,并记下代码中的位置。

但我可以看到一些潜在的麻烦点:

  • 你执行了很多字符串追加。他们每次都分配新内存吗?您的字符串类型是否允许您提前预留内存,如std::string可以做的?一般来说,字符串类是否有效?
  • 你循环遍历迭代器,并给出你似乎使用的可怕的匈牙利表示法,我假设你正在使用Windows,可能使用MSVC。某些版本的MSVC甚至在发布版本中也可以对STL迭代器进行大量运行时检查,除非您明确禁用它。 VS2005和2008特别对此表示不满。 2010只能在调试模式下启用此检查。
  • 当然, 构建并启用了优化,对吧?

但我只是指出似乎可能会减慢代码的速度。我不知道实际发生了什么。当然,我必须分析您的代码。你可以做到这一点。我不能。这样做。

答案 2 :(得分:1)

我不确定这是做什么的:  bstrSetWithIdsAsString.Append(buf);

但我想这是缓慢的地方,特别是如果必须通过查找第一个零字节来解决缓冲区末尾的问题,并且可能需要进行大量的重新分配。

为什么不使用wostringstream?