/* * Copyright 1999-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #if defined(_MSC_VER) #pragma warning(disable: 4127 4251 4511 4512 4514 4702 4710 4711 4786 4097; error: 4150 4172 4238 4239 4715) #if defined(_DEBUG) #include #endif #endif #include "ArenaBlock.hpp" #include "ReusableArenaBlock.hpp" #include "ArenaAllocator.hpp" #include "ReusableArenaAllocator.hpp" #include "StringArenaAllocator.hpp" #include "ReusableStringArenaAllocator.hpp" #include #include #include #include #include template class NullFunctor { public: void operator()(const Type* /* theType */) const { } }; template class DeleteFunctor { public: void operator()(const Type* theType) const { delete theType; } }; using std::cin; using std::cout; using std::endl; using std::for_each; using std::string; using std::vector; void Usage() { cout << endl << "Usage: ArenaBlock " << endl; } int main( int argc, char* argv[]) { if (argc != 3) { Usage(); } else { const size_t theCount = atol(argv[1]); const size_t theBlockCount = atol(argv[2]); if (theCount <= 0 || theBlockCount <= 0) { Usage(); } else { vector theStringVector; theStringVector.reserve(theCount); clock_t theStartClock = 0; #if defined(_MSC_VER) && defined(_DEBUG) // Send all reports to STDOUT _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT); _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE); _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT); _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE); _CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT); #endif { theStartClock = clock(); #if defined(_MSC_VER) && defined(_DEBUG) _CrtMemState theStartState; _CrtMemCheckpoint(&theStartState); #endif StringArenaAllocator m_allocator(theBlockCount); for (unsigned int i = 0; i < theCount; ++i) { theStringVector.push_back(m_allocator.create("Test string")); } #if defined(_MSC_VER) && defined(_DEBUG) _CrtMemState theEndState; _CrtMemCheckpoint(&theEndState); _CrtMemState theDiffs; _CrtMemDifference(&theDiffs, &theStartState, &theEndState); _CrtMemDumpStatistics(&theDiffs); #endif cout << "Create complete, hit to continue..." << endl; // cin.get(); for_each(theStringVector.begin(), theStringVector.end(), NullFunctor()); } clock_t theEndClock = clock(); cout << "Time to create and delete " << theCount << " strings using the arena allocator was " << theEndClock - theStartClock << " clock ticks." << endl << endl; theStringVector.clear(); { #if defined(_MSC_VER) && defined(_DEBUG) _CrtMemState theStartState; _CrtMemCheckpoint(&theStartState); #endif theStartClock = clock(); ReusableStringArenaAllocator m_allocator(theBlockCount); for (unsigned int i = 0; i < theCount; ++i) { theStringVector.push_back(m_allocator.create("Test string")); } #if defined(_MSC_VER) && defined(_DEBUG) _CrtMemState theEndState; _CrtMemCheckpoint(&theEndState); _CrtMemState theDiffs; _CrtMemDifference(&theDiffs, &theStartState, &theEndState); _CrtMemDumpStatistics(&theDiffs); #endif cout << "Create complete, hit to continue..." << endl; // cin.get(); for_each(theStringVector.begin(), theStringVector.end(), NullFunctor()); for (unsigned int j = 0; j < theCount; ++j) { m_allocator.destroy(theStringVector[j]); } } theEndClock = clock(); cout << "Time to create and delete " << theCount << " strings using the reusable arena allocator was " << theEndClock - theStartClock << " clock ticks." << endl << endl; theStringVector.clear(); { theStartClock = clock(); #if defined(_MSC_VER) && defined(_DEBUG) _CrtMemState theStartState; _CrtMemCheckpoint(&theStartState); #endif for (unsigned int i = 0; i < theCount; ++i) { theStringVector.push_back(new string("Test string")); } #if defined(_MSC_VER) && defined(_DEBUG) _CrtMemState theEndState; _CrtMemCheckpoint(&theEndState); _CrtMemState theDiffs; _CrtMemDifference(&theDiffs, &theStartState, &theEndState); _CrtMemDumpStatistics(&theDiffs); #endif cout << "Create complete, hit to continue..." << endl; // cin.get(); for_each(theStringVector.begin(), theStringVector.end(), DeleteFunctor()); } theEndClock = clock(); cout << "Time to create and delete " << theCount << " strings using standard new and delete was " << theEndClock - theStartClock << " clock ticks." << endl << endl; } } return 0; }