Этот цикл медленнее, чем я ожидал, и я пока не уверен, где. Видите что-нибудь?
Я читаю базу данных Accces, используя клиентские курсоры. Когда у меня 127 000 строк с 20 столбцами, этот цикл занимает около 10 секунд. 20 столбцов являются строковыми, целыми и типами даты. Все типы преобразуются в строки ANSI, прежде чем они помещаются в буфер ostringstream.
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 ();
Если я обойду созданные COM-оболочки Microsoft, будет ли мой код быстрее? Я думаю, нет.
Другая половина времени тратится на операторы, которые преобразуют данные и направляют их в поток ostring.
Я не знаю сейчас, когда я пишу это, будь то преобразования или потоковая передача, которые занимают больше времени.
Было бы быстрее, если бы я не использовал ostringstream и вместо этого управлял своим собственным буфером со своей собственной логикой для увеличения буфера (перераспределение, копирование, удаление)? Было бы быстрее, если бы моя логика сделала пессимистическое предположение и зарезервировала много места для буфера ostringstream заранее? Это могут быть эксперименты, которые стоит попробовать.
Наконец, сами преобразования. Ни один из трех не выделяется в моей жизни как плохой. Один ответ говорит, что моя Итоа может быть медленнее, чем альтернатива. Стоит проверить.