spirit/workbench/karma/sequence_performance.cpp
2014-04-01 15:06:38 +08:00

71 lines
3.4 KiB
C++

// Copyright (c) 2005-2010 Hartmut Kaiser
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
#define FUSION_MAX_TUPLE_SIZE 10
#define USE_FUSION_VECTOR
#include <climits>
#include <iostream>
#include <boost/preprocessor/repeat.hpp>
#include <boost/preprocessor/inc.hpp>
#include <boost/spirit/include/karma.hpp>
#include "../high_resolution_timer.hpp"
///////////////////////////////////////////////////////////////////////////////
static char const* const literal_sequences[] = {
"", "a", "ab", "abc", "abcd", "abcde",
"abcdef", "abcdefg", "abcdefgh", "abcdefghi", "abcdefgij"
};
///////////////////////////////////////////////////////////////////////////////
#define MAX_ITERATION 10000000
#define MAX_SEQUENCE_LENGTH 9
#define RCHAR(z, n, _) char_((char)('a' + n)) <<
#define SEQUENCE_TEST(z, N, _) \
{ \
util::high_resolution_timer t; \
\
for (int i = 0; i < MAX_ITERATION; ++i) \
{ \
char *ptr = buffer; \
generate(ptr, BOOST_PP_REPEAT(N, RCHAR, _) char_('\0')); \
} \
\
std::cout << "karma::sequence(" << BOOST_PP_INC(N) << "):\t" \
<< std::setw(9) << t.elapsed() << "\t" \
<< std::flush << std::endl; \
\
BOOST_ASSERT(std::string(buffer) == literal_sequences[N]); \
} \
/**/
// double elapsed = t.elapsed(); \
// for (int i = 0; i < MAX_ITERATION; ++i) \
// { \
// char *ptr = buffer; \
// generate(ptr, lit(literal_sequences[N]) << char_('\0')); \
// } \
// \
// t.restart(); \
// \
// << std::setw(9) << elapsed << " [s]" \
///////////////////////////////////////////////////////////////////////////////
int main()
{
using namespace boost::spirit::karma;
using namespace boost::spirit::ascii;
char buffer[512]; // we don't expect more than 512 bytes to be generated here
std::cout << "Benchmarking sequence of different length: " << std::endl;
BOOST_PP_REPEAT_FROM_TO(1, MAX_SEQUENCE_LENGTH, SEQUENCE_TEST, _);
return 0;
}