Re: Indexing techniques for hierarchies
Date: 26 Dec 2001 18:13:52 -0800
Message-ID: <a6e74506.0112261813.742ba3be_at_posting.google.com>
The following benchmark deviates from the steps outlined earlier in order to simplify it creation. Also posted at www.xdb1.com/Benchmark/7.asp
XDb required 16 ms to access 10,000 objects and copy their properites to variables starting with the last child. Each object was of a different class and each object was the child of the previous object. Each object had five properties of following data types: int(objId), bool, double, dateTime and string.
This benchmark is similar to the following in a relational database. Create 10,000 tables. Each table has one record. Each record has five fields plus an additional integer field is needed in a relational db to related records. Each record is the child of the record in the previous table. Access each record and copy its five properties to variables starting with the last child.
Below is the C++ code (edited for clarity) used for the benchmark.
void CXDbView::MenuTools_Benchmark_7_click()
{
// Get start time
// Create objPkg for Test Class
pTest = pO_m->InstPkg_add_(pRoot_g, // Cls pFldrMyData_g, // Parent _T("Test")); // Inst name
// Create property pPBool
pPBool = pO_m->InstPkg_add_(pRoot_g, // Cls pFldrMyData_g, // Parent _T("PBool")); // Inst name
// Create property pPDbl
pPDbl = pO_m->InstPkg_add_(pRoot_g, // Cls pFldrMyData_g, // Parent _T("PDbl")); // Inst name
// Create property pPDate
pPDate = pO_m->InstPkg_add_(pRoot_g, // Cls pFldrMyData_g, // Parent _T("PDate")); // Inst name
// Create property pPStr
pPStr = pO_m->InstPkg_add_(pRoot_g, // Cls pFldrMyData_g, // Parent _T("PStr")); // Inst name
// Attach properties to Test Cls and set default values
pO_m->Prop_childFirst_set_(pTest, pPBool,
kObjType_PropertyVirtual_g,
_T("True"));pO_m->Prop_childFirst_set_(pTest, pPDbl, kObjType_PropertyVirtual_g,
_T("1.2345678"));pO_m->Prop_childFirst_set_(pTest, pPDate, kObjType_PropertyVirtual_g,
_T("1/1/2001 12:00 P"));pO_m->Prop_childFirst_set_(pTest, pPStr, kObjType_PropertyVirtual_g,
_T("abcdefghijklmnopqrstuvwxyz0123456789"));
// Create X objects, each an instances and child of previous
pNew = pTest;
const int LOOPS = 10000;
for (int x=1; x < LOOPS; x++){
pNew = pO_m->Inst_add_(pNew, // cls pNew); // parent ASSERT(pNew);
}
// Get start time
DWORD timeStart = GetTickCount();
// Loop thru all instances starting from last child
pPBoolX = NULL;
pPDblX = NULL;
pPDateX = NULL;
pPStrX = NULL;
int id = 0;
bool bol = false;
double dbl = 0;
COleDateTime* dt;
TCHAR str[kObjTxtLenMax_g+1] = _T("");
pX = pNew;
while (pX != pTest){
// Get pX's props and put in local vars // Int id = pX->id; // Bool pPBoolX = pO_m->Prop_get_(pX, pPBool, false); bol = pO_m->DataBool_get_(pPBoolX->childFirst->cls); // Dbl pPDblX = pO_m->Prop_get_(pX, pPDbl, false); dbl = pO_m->DataDecimalPrecise_get_(pPDblX->childFirst->cls); // Date pPDateX = pO_m->Prop_get_(pX, pPDate, false); dt = pO_m->DataDateTime_get_(pPDateX->childFirst->cls); // Str pPStrX = pO_m->Prop_get_(pX, pPStr, false); pO_m->Data_getAsStr_(pPStrX->childFirst->cls, str); // Move to parent pX = pX->parent_();
}
// Get end time
DWORD timeEnd = GetTickCount();
// Calc time elapsed
DWORD timeElapsed = timeEnd - timeStart;
// Async flush memory to disk
pDb_m->File_save_();
// Display results
CString sResults;
sResults.Format(_T("Benchmark 7\n
Accessed props of %d hierarchal objs in %d msec."), LOOPS, timeElapsed);
MessageBox(sResults);
}
Received on Thu Dec 27 2001 - 03:13:52 CET