我有以下代码段。对于大小为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;
}
答案 0 :(得分:2)
我认为你的瓶颈是Append功能。你看,字符串里面有一些分配的内存,当你尝试追加一些不适合的东西时,它会重新分配更多的内存,这需要花费很多时间。尝试在开始时分配一次必要的内存。 HTH
答案 1 :(得分:1)
找出所有这些内容的唯一方法是分析应用程序。某些版本的Visual Studio配有功能齐全的分析器。
或者,只需在调试器中运行程序,并以随机间隔对其进行分解,并记下代码中的位置。
但我可以看到一些潜在的麻烦点:
std::string
可以做的?一般来说,字符串类是否有效?但我只是指出似乎可能会减慢代码的速度。我不知道实际发生了什么。当然,我必须分析您的代码。你可以做到这一点。我不能。这样做。
答案 2 :(得分:1)
我不确定这是做什么的:
bstrSetWithIdsAsString.Append(buf);
但我想这是缓慢的地方,特别是如果必须通过查找第一个零字节来解决缓冲区末尾的问题,并且可能需要进行大量的重新分配。
为什么不使用wostringstream?