此循環比我預期的要慢,我不確定它在哪裏。看到什麼?您認爲如何讓這個C++代碼變慢? (它通過一個ADODB記錄集循環,將COM類型轉換爲字符串,並填充ostringstream)
我正在閱讀Accces DB,使用客戶端遊標。當我有12萬行20列時,這個循環大約需要10秒。 20列是字符串,整型和日期類型。所有類型在放入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();
如果我繞過微軟生成的COM包裝,我的代碼會更快嗎?我的猜測是否定的。
時的行吟詩人的一半是花在其中的數據轉換和它傳輸到ostringstream的語句。
我不知道現在,因爲我寫這個,無論是轉換還是流媒體花費更多時間。
難道是更快,如果我沒有用ostringstream,而是管理我自己的緩衝區,用我自己的邏輯來增加緩衝區(重新ALLOC,複製,刪除)?如果我的邏輯做出了悲觀的猜測,並且預先爲ostringstream緩衝區保留了大量空間,會更快嗎?這些可能是值得嘗試的實驗。
最後,轉換本身。在我的時間裏,三人中沒有一人表現出色。一個答案說,我的itoa可能比替代品慢。值得檢查。
宏,不是一個函數,像 的#define V_VT(X)X-> VT – 2008-11-07 04:25:06