// Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved #include #include #include #include #undef _CRTIMP #define POLARITY __declspec( dllexport ) #define _CRTIMP POLARITY #include #undef _CRTIMP #define _CRTIMP __declspec(dllimport) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include std::_Lockit::_Lockit() { } std::_Lockit::~_Lockit() { } #define ARRAY_SIZE 1000 UINT64 t_Array[ARRAY_SIZE]; void InitAscendArray() { for (int i = 0; i < ARRAY_SIZE; i++) t_Array[i] = i; } void InitDescendArray() { for (int i = ARRAY_SIZE - 1; i >= 0; i--) t_Array[i] = i; } void InitRandomArray() { InitAscendArray(); for (int i = 0; i < ARRAY_SIZE; i++) { int iToSwapWith = (rand() % ARRAY_SIZE); UINT64 iTemp = t_Array[i]; t_Array[i] = t_Array[iToSwapWith]; t_Array[iToSwapWith] = iTemp; } } void Test_BasicTree () { WmiStatusCode t_StatusCode = e_StatusCode_Success ; WmiAllocator t_Allocator ( WmiAllocator :: e_DefaultAllocation , 0 , 1 << 24 ) ; t_StatusCode = t_Allocator.Initialize () ; if ( t_StatusCode == e_StatusCode_Success ) { WmiBasicTree t_Tree ( t_Allocator ) ; WmiBasicTree :: Iterator t_Iterator ; t_StatusCode = t_Tree.Initialize () ; if ( t_StatusCode == e_StatusCode_Success ) { UINT64 t_Size = sizeof ( t_Array ) / sizeof ( UINT64 ) ; for ( UINT64 t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Index ] ; UINT64 t_Value = 0xFFFFFFFF00000000 + t_Index ; t_StatusCode = t_Tree.Insert ( t_Key , t_Value , t_Iterator ) ; if ( t_StatusCode != e_StatusCode_Success ) { printf ( "\n Insert Error" ) ; } } t_Index = 0 ; t_Iterator = t_Tree.End () ; while ( ! t_Iterator.Null () ) { t_Iterator.Decrement () ; t_Index ++ ; } t_Index = 0 ; t_Iterator = t_Tree.Begin () ; while ( ! t_Iterator.Null () ) { t_Iterator.Increment () ; t_Index ++ ; } t_Iterator = t_Tree.Begin () ; t_Iterator.Decrement () ; t_Iterator = t_Tree.End () ; t_Iterator.Increment () ; for ( t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Index ] ; t_StatusCode = t_Tree.Find ( t_Key , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { } else { printf ( "\nFailure" ) ; } } for ( t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Size - t_Index - 1 ] ; t_StatusCode = t_Tree.Delete ( t_Key ) ; if ( t_StatusCode == e_StatusCode_Success ) { } else { printf ( "\nFailure" ) ; } } } } } double GetSeconds(DWORD dwBegin) { DWORD dwDiff = GetTickCount() - dwBegin; return ((float) dwDiff) / 1000.0; } void Test_AvlTree( double &fInsert, double &fIterate, double &fFind, double &fDelete) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; WmiAllocator t_Allocator ; DWORD dwBegin; t_StatusCode = t_Allocator.Initialize () ; if ( t_StatusCode == e_StatusCode_Success ) { WmiAvlTree *pTree = new WmiAvlTree ( t_Allocator ), &t_Tree = *pTree; WmiAvlTree :: Iterator t_Iterator ; t_StatusCode = t_Tree.Initialize () ; if ( t_StatusCode == e_StatusCode_Success ) { UINT64 t_Size = sizeof ( t_Array ) / sizeof ( UINT64 ) ; dwBegin = GetTickCount(); for ( UINT64 t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Index ] ; UINT64 t_Value = 0xFFFFFFFF00000000 + t_Index ; t_StatusCode = t_Tree.Insert ( t_Key , t_Value , t_Iterator ) ; if ( t_StatusCode != e_StatusCode_Success && t_StatusCode != e_StatusCode_AlreadyExists) { printf ( "\nError" ) ; } } fInsert = GetSeconds(dwBegin); #if 0 ULONG t_MaxHeight ; t_StatusCode = t_Tree.Check ( t_MaxHeight ) ; if ( t_StatusCode != e_StatusCode_Success ) { printf ( "\nError" ) ; } #endif dwBegin = GetTickCount(); t_Index = 0 ; t_Iterator = t_Tree.Begin () ; while ( ! t_Iterator.Null () ) { t_Iterator.Increment () ; t_Index ++ ; } fIterate = GetSeconds(dwBegin); //t_Iterator = t_Tree.Begin () ; //t_Iterator.Decrement () ; //t_Iterator = t_Tree.End () ; //t_Iterator.Increment () ; dwBegin = GetTickCount(); for ( t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Index ] ; t_StatusCode = t_Tree.Find ( t_Key , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { } else { printf ( "\nFailure" ) ; } } fFind = GetSeconds(dwBegin); dwBegin = GetTickCount(); delete pTree; fDelete = GetSeconds(dwBegin); /* for ( t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Size - t_Index - 1 ] ; t_StatusCode = t_Tree.Delete ( t_Key ) ; if ( t_StatusCode == e_StatusCode_Success ) { } else { //printf ( "\nFailure" ) ; } } */ } } } void Test_ThreadedAvlTree( double &fInsert, double &fIterate, double &fFind, double &fDelete) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; WmiAllocator t_Allocator ; DWORD dwBegin; t_StatusCode = t_Allocator.Initialize () ; if ( t_StatusCode == e_StatusCode_Success ) { WmiThreadedAvlTree *pTree = new WmiThreadedAvlTree ( t_Allocator ), &t_Tree = *pTree; WmiThreadedAvlTree :: Iterator t_Iterator ; t_StatusCode = t_Tree.Initialize () ; if ( t_StatusCode == e_StatusCode_Success ) { UINT64 t_Size = sizeof ( t_Array ) / sizeof ( UINT64 ) ; dwBegin = GetTickCount(); for ( UINT64 t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Index ] ; UINT64 t_Value = 0xFFFFFFFF00000000 + t_Index ; t_StatusCode = t_Tree.Insert ( t_Key , t_Value , t_Iterator ) ; if ( t_StatusCode != e_StatusCode_Success && t_StatusCode != e_StatusCode_AlreadyExists) { printf ( "\nError" ) ; } } fInsert = GetSeconds(dwBegin); #if 0 ULONG t_MaxHeight ; t_StatusCode = t_Tree.Check ( t_MaxHeight ) ; if ( t_StatusCode != e_StatusCode_Success ) { printf ( "\nError" ) ; } #endif dwBegin = GetTickCount(); t_Index = 0 ; t_Iterator = t_Tree.Begin () ; while ( ! t_Iterator.Null () ) { t_Iterator.Increment () ; t_Index ++ ; } fIterate = GetSeconds(dwBegin); //t_Iterator = t_Tree.Begin () ; //t_Iterator.Decrement () ; //t_Iterator = t_Tree.End () ; //t_Iterator.Increment () ; dwBegin = GetTickCount(); for ( t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Index ] ; t_StatusCode = t_Tree.Find ( t_Key , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { } else { printf ( "\nFailure" ) ; } } fFind = GetSeconds(dwBegin); dwBegin = GetTickCount(); delete pTree; fDelete = GetSeconds(dwBegin); /* for ( t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Size - t_Index - 1 ] ; t_StatusCode = t_Tree.Delete ( t_Key ) ; if ( t_StatusCode == e_StatusCode_Success ) { } else { //printf ( "\nFailure" ) ; } } */ } } } void Test_KeyedArray( double &fInsert, double &fIterate, double &fFind, double &fDelete) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; WmiAllocator t_Allocator ; DWORD dwBegin; t_StatusCode = t_Allocator.Initialize () ; if ( t_StatusCode == e_StatusCode_Success ) { WmiKeyedArray *pTree = new WmiKeyedArray ( t_Allocator ), &t_Tree = *pTree; WmiKeyedArray :: Iterator t_Iterator ; t_StatusCode = t_Tree.Initialize () ; if ( t_StatusCode == e_StatusCode_Success ) { UINT64 t_Size = sizeof ( t_Array ) / sizeof ( UINT64 ) ; dwBegin = GetTickCount(); for ( UINT64 t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Index ] ; UINT64 t_Value = 0xFFFFFFFF00000000 + t_Index ; t_StatusCode = t_Tree.Insert ( t_Key , t_Value , t_Iterator ) ; if ( t_StatusCode != e_StatusCode_Success && t_StatusCode != e_StatusCode_AlreadyExists) { printf ( "\nError" ) ; } } fInsert = GetSeconds(dwBegin); #if 0 ULONG t_MaxHeight ; t_StatusCode = t_Tree.Check ( t_MaxHeight ) ; if ( t_StatusCode != e_StatusCode_Success ) { printf ( "\nError" ) ; } #endif dwBegin = GetTickCount(); t_Index = 0 ; t_Iterator = t_Tree.Begin () ; while ( ! t_Iterator.Null () ) { t_Iterator.Increment () ; t_Index ++ ; } fIterate = GetSeconds(dwBegin); //t_Iterator = t_Tree.Begin () ; //t_Iterator.Decrement () ; //t_Iterator = t_Tree.End () ; //t_Iterator.Increment () ; dwBegin = GetTickCount(); for ( t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Index ] ; t_StatusCode = t_Tree.Find ( t_Key , t_Iterator ) ; if ( t_StatusCode == e_StatusCode_Success ) { } else { printf ( "\nFailure" ) ; } } fFind = GetSeconds(dwBegin); dwBegin = GetTickCount(); delete pTree; fDelete = GetSeconds(dwBegin); /* for ( t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Size - t_Index - 1 ] ; t_StatusCode = t_Tree.Delete ( t_Key ) ; if ( t_StatusCode == e_StatusCode_Success ) { } else { //printf ( "\nFailure" ) ; } } */ } } } LONG ULONG_ComparisonFunction ( void *a_ComparatorOperand , const WmiBPKey &a_Key1 , const WmiBPKey &a_Key2 ) { ULONG *t_Key1 = ( ULONG * ) ( a_Key1.GetConstData () ) ; ULONG *t_Key2 = ( ULONG * ) ( a_Key2.GetConstData () ) ; return *t_Key1 - *t_Key2 ; } void Test_Map( double &fInsert, double &fIterate, double &fFind, double &fDelete) { std :: map *pTree = new std :: map , &t_Tree = *pTree; std :: map :: iterator t_Iterator ; UINT64 t_Size = sizeof ( t_Array ) / sizeof ( UINT64 ) ; DWORD dwBegin = GetTickCount(); for ( UINT64 t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Index ] ; UINT64 t_Value = 0xFFFFFFFF00000000 + t_Index ; //try { t_Tree [ t_Key ] = t_Value ; } /* catch ( ... ) { printf ( "\nError" ) ; } */ } fInsert = GetSeconds(dwBegin); /* t_Index = 0 ; t_Iterator = t_Tree.end () ; t_Iterator -- ; while ( t_Iterator != t_Tree.end () ) { t_Iterator -- ; t_Index ++ ; } */ dwBegin = GetTickCount(); t_Index = 0 ; t_Iterator = t_Tree.begin () ; while ( t_Iterator != t_Tree.end () ) { t_Iterator ++ ; t_Index ++ ; } fIterate = GetSeconds(dwBegin); //t_Iterator = t_Tree.begin () ; //t_Iterator -- ; //t_Iterator = t_Tree.end () ; //t_Iterator ++ ; dwBegin = GetTickCount(); for ( t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Index ] ; t_Iterator = t_Tree.find ( t_Key ) ; if ( t_Iterator != t_Tree.end () ) { UINT64 t_Value = t_Iterator->second ; } else { printf ( "\nSTL Failure" ) ; } } fFind = GetSeconds(dwBegin); dwBegin = GetTickCount(); delete pTree; fDelete = GetSeconds(dwBegin); /* for ( t_Index = 0 ; t_Index < t_Size ; t_Index ++ ) { UINT64 t_Key = t_Array [ t_Size - t_Index - 1 ] ; t_Tree.erase ( t_Key ) ; } */ } void DoStl() { double fInsert, fIterate, fFind, fDelete; Test_Map(fInsert, fIterate, fFind, fDelete); printf( "STL map:\n" " Insert : %.02f\n" " Iterate : %.02f\n" " Find : %.02f\n" //" Free : %.02f\n" " TOTAL : %.02f\n", fInsert, fIterate, fFind, //fDelete, //fInsert + fIterate + fFind + fDelete); fInsert + fIterate + fFind); } void DoAVL() { double fInsert, fIterate, fFind, fDelete; Test_AvlTree(fInsert, fIterate, fFind, fDelete); printf( "AVL Tree:\n" " Insert : %.02f\n" " Iterate : %.02f\n" " Find : %.02f\n" //" Free : %.02f\n" " TOTAL : %.02f\n", fInsert, fIterate, fFind, //fDelete, //fInsert + fIterate + fFind + fDelete); fInsert + fIterate + fFind); } void DoThreadedAVL() { double fInsert, fIterate, fFind, fDelete; Test_ThreadedAvlTree(fInsert, fIterate, fFind, fDelete); printf( "ThreadedAVL Tree:\n" " Insert : %.02f\n" " Iterate : %.02f\n" " Find : %.02f\n" //" Free : %.02f\n" " TOTAL : %.02f\n", fInsert, fIterate, fFind, //fDelete, //fInsert + fIterate + fFind + fDelete); fInsert + fIterate + fFind); } void DoKeyedArray () { double fInsert, fIterate, fFind, fDelete; Test_KeyedArray(fInsert, fIterate, fFind, fDelete); printf( "Keyed Array:\n" " Insert : %.02f\n" " Iterate : %.02f\n" " Find : %.02f\n" //" Free : %.02f\n" " TOTAL : %.02f\n", fInsert, fIterate, fFind, //fDelete, //fInsert + fIterate + fFind + fDelete); fInsert + fIterate + fFind); } EXTERN_C int __cdecl wmain ( int argc , char **argv ) { printf("Testing over %d values:\n", ARRAY_SIZE); printf("Doing ascending...\n"); InitAscendArray(); DoAVL(); DoStl(); DoThreadedAVL(); DoKeyedArray(); printf("\nDoing descending...\n"); InitDescendArray(); DoAVL(); DoStl(); DoThreadedAVL(); DoKeyedArray(); printf("\nDoing random...\n"); InitRandomArray(); DoAVL(); DoStl(); DoThreadedAVL(); DoKeyedArray(); }