このループは私が予想するよりも遅く、まだどこにあるのかわかりません。何か見えますか?
クライアント側のカーソルを使用して、AcccesDBを読み取っています。20列の127,000行がある場合、このループには約10秒かかります。20列は、string、int、およびdateタイプです。すべてのタイプは、ostringstreamバッファーに入れられる前に、ANSI文字列に変換されます。
void LoadRecordsetIntoStream(_RecordsetPtr& pRs, ostringstream& ostrm)
{
ADODB::FieldsPtr pFields = pRs->Fields;
char buf[80];
::SYSTEMTIME sysTime;
_variant_t var;
while(!pRs->EndOfFile) // loop through rows
{
for (long i = 0L; i < nColumns; i++) // loop through columns
{
var = pFields->GetItem(i)->GetValue();
if (V_VT(&var) == VT_BSTR)
{
ostrm << (const char*) (_bstr_t) var;
}
else if (V_VT(&var) == VT_I4
|| V_VT(&var) == VT_UI1
|| V_VT(&var) == VT_I2
|| V_VT(&var) == VT_BOOL)
{
ostrm << itoa(((int)var),buf,10);
}
else if (V_VT(&var) == VT_DATE)
{
::VariantTimeToSystemTime(var,&sysTime);
_stprintf(buf, _T("%4d-%02d-%02d %02d:%02d:%02d"),
sysTime.wYear, sysTime.wMonth, sysTime.wDay,
sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
ostrm << buf;
}
}
pRs->MoveNext();
}
}
編集:さらに実験した後...
この行で約半分の時間が使用されていることがわかりました
。var=pFields->GetItem(i)-> GetValue();
Microsoftが生成したCOMラッパーをバイパスした場合、コードは高速になりますか?私の推測は違います。
時間の残りの半分は、データを変換してostringstreamにストリーミングするステートメントに費やされます。
これを書いているので、変換に時間がかかっているのか、ストリーミングに時間がかかっているのかは、今のところわかりません。
ostringstreamを使用せず、代わりにバッファを拡張する独自のロジック(再割り当て、コピー、削除)を使用して独自のバッファを管理した場合、より高速になりますか?私のロジックが悲観的な推測を行い、ostringstreamバッファー用に多くのスペースを事前に予約した場合、より速くなりますか?これらは試す価値のある実験かもしれません。
最後に、変換自体。私のタイミングでは、3つのうちどれも悪いものとして目立ちません。ある答えは、私のitoaは他の方法よりも遅いかもしれないと言っています。チェックアウトする価値があります。