File: sequence_performance.cpp

package info (click to toggle)
boost1.74 1.74.0-9
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 464,084 kB
  • sloc: cpp: 3,338,324; xml: 131,293; python: 33,088; ansic: 14,336; asm: 4,034; sh: 3,351; makefile: 1,193; perl: 1,036; yacc: 478; php: 212; ruby: 102; lisp: 24; sql: 13; csh: 6
file content (70 lines) | stat: -rw-r--r-- 3,470 bytes parent folder | download | duplicates (18)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//  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;
}