blob: a1574896922e0fdcb83a3463431e3850b8c3b5dd [file] [log] [blame]
/*
* 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 <crtdbg.h>
#endif
#endif
#include "ArenaBlock.hpp"
#include "ReusableArenaBlock.hpp"
#include "ArenaAllocator.hpp"
#include "ReusableArenaAllocator.hpp"
#include "StringArenaAllocator.hpp"
#include "ReusableStringArenaAllocator.hpp"
#include <cstdio>
#include <ctime>
#include <iostream>
#include <string>
#include <vector>
template<class Type>
class NullFunctor
{
public:
void
operator()(const Type* /* theType */) const
{
}
};
template<class Type>
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 <count> <block size>"
<< 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<string*> 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 <Enter> to continue..."
<< endl;
// cin.get();
for_each(theStringVector.begin(),
theStringVector.end(),
NullFunctor<string>());
}
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 <Enter> to continue..."
<< endl;
// cin.get();
for_each(theStringVector.begin(),
theStringVector.end(),
NullFunctor<string>());
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 <Enter> to continue..."
<< endl;
// cin.get();
for_each(theStringVector.begin(),
theStringVector.end(),
DeleteFunctor<string>());
}
theEndClock = clock();
cout << "Time to create and delete "
<< theCount
<< " strings using standard new and delete was "
<< theEndClock - theStartClock
<< " clock ticks."
<< endl
<< endl;
}
}
return 0;
}