我有以下代码段。对于大小为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;
}发布于 2011-02-23 20:28:30
我认为你的瓶颈是Append函数。你看,字符串里面有一些分配的内存,当你试图追加一些不合适的东西时,它会重新分配更多的内存,这需要很多时间。尝试在开始时分配一次必要的内存。HTH
发布于 2011-02-23 20:27:51
要找出所有这些时间都占用了什么,唯一的方法是分析应用程序。Visual Studio的某些版本附带了一个功能齐全的分析器。
但我可以看到一些潜在的麻烦:
,
std::string那样提前预留内存吗?一般来说,string类是有效的吗?但我只是想指出它可能会减慢你的代码。我不知道到底发生了什么。可以肯定的是,我必须分析你的代码。你可以做到的。我做不到。那就做吧。
发布于 2011-02-23 20:32:08
我不确定这是在做什么:bstrSetWithIdsAsString.Append(buf);
但我猜这就是速度慢的地方,特别是如果它每次都要通过查找第一个零字节来计算缓冲区的结束位置,并且可能需要进行大量的重新分配。
为什么不使用wostringstream呢?
https://stackoverflow.com/questions/5090721
复制相似问题