首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >性能调优

性能调优
EN

Stack Overflow用户
提问于 2011-02-23 20:11:34
回答 3查看 667关注 0票数 0

我有以下代码段。对于大小为176000的向量,循环执行时间长达8分钟。我不知道是什么花了这么多时间

代码语言:javascript
复制
    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;
}
EN

回答 3

Stack Overflow用户

发布于 2011-02-23 20:28:30

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

票数 2
EN

Stack Overflow用户

发布于 2011-02-23 20:27:51

要找出所有这些时间都占用了什么,唯一的方法是分析应用程序。Visual Studio的某些版本附带了一个功能齐全的分析器。

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

  • ,你执行了很多字符串追加。它们每次都会分配新的内存吗?你的字符串类型允许你像std::string那样提前预留内存吗?一般来说,string类是有效的吗?
  • 你循环遍历迭代器,考虑到你使用的是可怕的匈牙利符号,我假设你是在Windows上工作,可能是使用MSVC。有些版本的MSVC即使在发布版本中也启用了大量的STL迭代器的运行时检查,除非您显式禁用它。VS2005和2008在这一点上特别有罪。2010仅在调试模式下启用此检查。
  • ,当然,您在构建时启用了优化,对吧?

但我只是想指出它可能会减慢你的代码。我不知道到底发生了什么。可以肯定的是,我必须分析你的代码。你可以做到的。我做不到。那就做吧。

票数 1
EN

Stack Overflow用户

发布于 2011-02-23 20:32:08

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

但我猜这就是速度慢的地方,特别是如果它每次都要通过查找第一个零字节来计算缓冲区的结束位置,并且可能需要进行大量的重新分配。

为什么不使用wostringstream呢?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5090721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档