open-source-search-engine/treetest.cpp

189 lines
3.9 KiB
C++
Raw Normal View History

2013-08-03 00:12:24 +04:00
// Matt Wells, copyright Jan 2002
// program to test the RdbTree
#include "RdbTree.h"
#include "sort.h"
static int cmp ( const void *h1 , const void *h2 ) ;
bool mainShutdown ( bool urgent ) { return true; }
2014-11-11 01:45:11 +03:00
int32_t speedtest ( int32_t numNodes , bool balanced ) ;
int32_t sanitytest () ;
2013-08-03 00:12:24 +04:00
int main ( int argc , char *argv[] ) {
g_mem.init ( 1000000000 );
2014-11-11 01:45:11 +03:00
int32_t n = 15000*2 ;
2013-08-03 00:12:24 +04:00
bool balanced = false;
if ( argc > 1 ) n = atoi ( argv[1] );
if ( argc > 2 ) balanced = (bool) atoi ( argv[2] );
// return sanitytest();
return speedtest ( n , balanced );
}
2014-11-11 01:45:11 +03:00
int32_t speedtest ( int32_t numNodes , bool balanced ) {
2013-08-03 00:12:24 +04:00
2014-11-11 01:45:11 +03:00
//int32_t numNodes = 15000*2;
2013-08-03 00:12:24 +04:00
char *bs = "";
if ( ! balanced ) bs = "UN";
log("
2014-11-11 01:45:11 +03:00
making %sbalanced tree with %"INT32" nodes",bs,numNodes);
2013-08-03 00:12:24 +04:00
RdbTree t;
if ( ! t.set ( 0 , // fixedDataSize
numNodes , // maxTreeNodes
false , // isTreeBalanced
numNodes*35 , // maxmem
false )) { // own data?
fprintf(stderr,"init error\n");
return -1;
}
// make random keys
key_t *keys = (key_t *) malloc ( sizeof(key_t) * numNodes );
if ( ! keys ) {
fprintf(stderr,"malloc error\n");
return -1;
}
2014-11-11 01:45:11 +03:00
for ( int32_t i = 0 ; i < numNodes ; i++ ) {
2013-08-03 00:12:24 +04:00
key_t k;
k.n1 = rand() ;
k.n0 = rand();
k.n0 <<= 32;
k.n0 |= rand();
keys[i] = k;
}
2014-11-11 01:45:11 +03:00
log("generated %"INT32" random keys",numNodes);
2013-08-03 00:12:24 +04:00
//char *data = (char *)mmalloc ( numNodes * sizeof(key_t), "treetest");
//char *pp = data;
//if ( ! data ) { log("shit"); return -1; }
2014-10-30 22:36:39 +03:00
int64_t t1 = gettimeofdayInMilliseconds();
2014-11-11 01:45:11 +03:00
for ( int32_t i = 0 ; i < numNodes ; i++ ) {
2013-08-03 00:12:24 +04:00
t.addNode ( keys[i] , NULL , 0 ); // , pp , 5*1024 );
//pp += 5*1024;
}
2014-10-30 22:36:39 +03:00
int64_t t2 = gettimeofdayInMilliseconds();
2014-11-11 01:45:11 +03:00
log("added %"INT32" keys to tree in %"INT64" ms", numNodes , t2 - t1 );
2013-08-03 00:12:24 +04:00
// now get the list
t1 = gettimeofdayInMilliseconds();
RdbList list;
key_t startKey;
key_t endKey;
startKey.n0 = 0LL; startKey.n1 = 0;
endKey.setMax();
2014-11-11 01:45:11 +03:00
int32_t xx;
2013-08-03 00:12:24 +04:00
if ( ! t.getList ( startKey ,
endKey ,
1*1024*1024 ,
&list ,
&xx , // num negative keys
false ) ) { // use half keys?
log("problem: %s",mstrerror(g_errno));
return -1;
}
t2 = gettimeofdayInMilliseconds();
2014-11-11 01:45:11 +03:00
log("got list of %"INT32" bytes (%"INT32" keys) in %"INT64" ms",
2013-08-03 00:12:24 +04:00
list.getListSize(),numNodes,t2-t1);
return 0;
}
2014-11-11 01:45:11 +03:00
int32_t sanitytest () {
2013-08-03 00:12:24 +04:00
RdbTree t;
if ( ! t.set ( 0 , //fixedDataSize ,
1500000 , // maxTreeNodes
false , //isTreeBalanced ,
1500000*12*2 ,// maxmem
false )) { // own data?
fprintf(stderr,"init error\n");
return -1;
}
key_t *keys = (key_t *) malloc ( sizeof(key_t) * 1505000 );
if ( ! keys ) {
fprintf(stderr,"malloc error\n");
return -1;
}
2014-11-11 01:45:11 +03:00
int32_t p = 0;
2013-08-03 00:12:24 +04:00
loop:
2014-11-11 01:45:11 +03:00
fprintf(stderr,"pass=%"INT32"\n",p++);
2013-08-03 00:12:24 +04:00
// make random keys
2014-11-11 01:45:11 +03:00
for ( int32_t i = 0 ; i < 1505000 ; i++ ) {
2013-08-03 00:12:24 +04:00
key_t k;
k.n1 = rand() ;
k.n0 = rand();
k.n0 <<= 32;
k.n0 |= rand();
keys[i] = k;
}
// add em
2014-11-11 01:45:11 +03:00
for ( int32_t i = 0 ; i < 1500000 ; i++ )
2013-08-03 00:12:24 +04:00
if ( t.addNode ( keys[i] , NULL , 0) < 0 ) {
fprintf(stderr,"add error\n");
return -1;
}
// sort 'em
gbsort (keys , 1500000 , sizeof(key_t) , cmp );
// delete em in order now
2014-11-11 01:45:11 +03:00
for ( int32_t i = 0 ; i < 750000 ; i++ )
2013-08-03 00:12:24 +04:00
if ( t.deleteNode ( keys[i] , true ) < 0 ) {
fprintf(stderr,"node not found\n");
return -1;
}
// add 5000 nodes
2014-11-11 01:45:11 +03:00
for ( int32_t i = 1500000 ; i < 1505000 ; i++ )
2013-08-03 00:12:24 +04:00
if ( t.addNode ( keys[i] , NULL , 0) < 0 ) {
fprintf(stderr,"add error\n");
return -1;
}
// delete remaining 750000
2014-11-11 01:45:11 +03:00
for ( int32_t i = 750000 ; i < 1500000 ; i++ )
2013-08-03 00:12:24 +04:00
if ( t.deleteNode ( keys[i] , true ) < 0 ) {
fprintf(stderr,"node not found\n");
return -1;
}
// test tree
//t.printTree();
t.clear();
goto loop;
return 0;
}
int cmp ( const void *h1 , const void *h2 ) {
if ( *(key_t *)h1 < *(key_t *)h2 ) return -1;
if ( *(key_t *)h1 > *(key_t *)h2 ) return 1;
return 0;
}