why GetFieldValue() is so slow
I get connected a vfp6 dbf file, and the total record number is about
50000, I want to export specified field value ( most of their type are
string), and the result is correct, but it works toooooo slow, and I
find the function GetFieldValue takes most time.
my code is:
while(!m_Rs.IsEOF())
{
for(index=0; index < m_ListDest.GetCount(); index++)
{
strLine=m_pSortItem[m_pSortList[index]];
m_Rs.GetFieldValue(m_pSortList[index], strVal);
strVal.TrimRight(_T(' '));
if(strVal == "" && m_isFilter)
continue;
strLine.Insert(0, _T('['));
strLine.Insert(strLine.GetLength(), _T("]:"));
strLine.Insert(strLine.GetLength(), strVal);
strLine.Insert(strLine.GetLength(), C_Enter);
strLine.TrimRight(_T(' '));
fwrite(strLine.GetBuffer(2), sizeof(TCHAR), strLine.GetLength(),
pOutput_file);
}
fwrite(&C_Enter, sizeof(TCHAR), 1, pOutput_file);
m_Rs.MoveNext();
RecordCount++;
if(RecordCount == 100)
{
Time = GetTickCount() - Time;
break;
}
}
fclose(pOutput_file);
the Time shows how long will it take, and because it is very slow, I
break it when 100 records have processed.
with the profile mode, it is obvious:
Profile: Function timing, sorted by time
Date: Wed May 17 22:45:38 2006
Program Statistics
------------------
Command line at 2006 May 17 22:45:
"F:\Training\databasetool\Debug\databasetool"
Total time: 23453.762 millisecond
Time outside of functions: 87.659 millisecond
Call depth: 22
Total functions: 227
Total hits: 21321
Function coverage: 61.2%
Overhead Calculated 5
Overhead Average 5
Module Statistics for databasetool.exe
--------------------------------------
Time in module: 23366.103 millisecond
Percent of time in module: 100.0%
Functions in module: 227
Hits in module: 21321
Module function coverage: 61.2%
Func Func+Child Hit
Time % Time % Count Function
---------------------------------------------------------
12373.771 53.0 12373.981 53.0 500
CRecordset::GetFieldValue(short,class CString &) (mfcd42d.dll)
7784.674 33.3 23198.355 99.3 260
CWinThread::PumpMessage(void) (mfc42d.dll)
2663.737 11.4 2668.303 11.4 1
CFileDialog::DoModal(void) (mfc42d.dll)
156.984 0.7 158.311 0.7 102
CRecordset::Move(long,unsigned short) (mfcd42d.dll)
114.126 0.5 114.354 0.5 807
CWnd::DefWindowProcA(unsigned int,unsigned int,long) (mfc42d.dll)
86.992 0.4 23315.177 99.8 1 CDialog::DoModal(void)
(mfc42d.dll)
47.422 0.2 15134.158 64.8 1
CDatabasetoolDlg::Export2File(void) (databasetooldlg.obj)
37.226 0.2 37.226 0.2 1
CDatabase::~CDatabase(void) (mfcd42d.dll)
21.104 0.1 15328.205 65.6 927 CWnd::OnWndMsg(unsigned
int,unsigned int,long,long *) (mfc42d.dll)
19.589 0.1 19.589 0.1 1000 CString::TrimRight(char)
(mfc42d.dll)
13.165 0.1 13.165 0.1 1
CRecordset::~CRecordset(void) (mfcd42d.dll)
8.671 0.0 8.671 0.0 616 CListBox::GetCount(void)
(mfc42d.dll)
8.478 0.0 161.017 0.7 1
CDatabasetoolDlg::LoadDatabase(void) (databasetooldlg.obj)
7.640 0.0 15308.511 65.5 260
CDialog::PreTranslateMessage(struct tagMSG *) (mfc42d.dll)
3.455 0.0 3.455 0.0 1000
CString::Insert(int,char) (mfc42d.dll)
3.217 0.0 152.538 0.7 1
CRecordset::Open(unsigned int,char const *,unsigned long) (mfcd42d.dll)
1.890 0.0 2.012 0.0 21 CWnd::EnableWindow(int)
(mfc42d.dll)
....
I want to know how can I make it faster, any advice is helpful, and
thank you!