aboutsummaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/benchmark/testbase.h
blob: 4bbd704a4d5c2eb00332f9630b4625f74df31aa6 (plain) (blame)
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
// Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#pragma once

#include <vespa/vespalib/objects/identifiable.h>
#include <vector>
#include <string>

#define BENCHMARK_BASE_CID(n) (0x1000000 + n)

#define CID_vespalib_Benchmark                      BENCHMARK_BASE_CID(0)
#define CID_vespalib_ParamByReferenceVectorInt      BENCHMARK_BASE_CID(1)
#define CID_vespalib_ParamByReferenceVectorString   BENCHMARK_BASE_CID(2)
#define CID_vespalib_ParamByValueVectorInt          BENCHMARK_BASE_CID(3)
#define CID_vespalib_ParamByValueVectorString       BENCHMARK_BASE_CID(4)
#define CID_vespalib_ReturnByReferenceVectorString  BENCHMARK_BASE_CID(5)
#define CID_vespalib_ReturnByValueVectorString      BENCHMARK_BASE_CID(6)
#define CID_vespalib_ReturnByValueMultiVectorString BENCHMARK_BASE_CID(7)
#define CID_vespalib_ClockSystem             BENCHMARK_BASE_CID(8)
#define CID_vespalib_ClockREALTIME           BENCHMARK_BASE_CID(10)
#define CID_vespalib_ClockMONOTONIC          BENCHMARK_BASE_CID(11)
#define CID_vespalib_ClockMONOTONIC_RAW      BENCHMARK_BASE_CID(12)
#define CID_vespalib_ClockPROCESS_CPUTIME_ID BENCHMARK_BASE_CID(13)
#define CID_vespalib_ClockTHREAD_CPUTIME_ID  BENCHMARK_BASE_CID(14)
#define CID_vespalib_CreateVespalibString    BENCHMARK_BASE_CID(15)

#define DECLARE_BENCHMARK(a) DECLARE_IDENTIFIABLE_NS(vespalib, a)
#define IMPLEMENT_BENCHMARK(a, d) IMPLEMENT_IDENTIFIABLE_NS(vespalib, a, d)

namespace vespalib {

class Benchmark : public Identifiable
{
public:
    DECLARE_IDENTIFIABLE_ABSTRACT_NS(vespalib, Benchmark);
    void run(size_t numRuns, size_t concurrency=1);
    static void run(const char * testName, size_t numRuns, size_t concurrency);
private:
    virtual size_t onRun() = 0;
};

class ParamByReferenceVectorInt : public Benchmark
{
public:
    DECLARE_BENCHMARK(ParamByReferenceVectorInt);
private:
    using Vector = std::vector<int>;
    size_t callByReference(const Vector & values) const __attribute__((noinline));
    size_t onRun() override;
};

class ParamByValueVectorInt : public Benchmark
{
public:
    DECLARE_BENCHMARK(ParamByValueVectorInt);
private:
    using Vector = std::vector<int>;
    size_t callByValue(Vector values) const __attribute__((noinline));
    size_t onRun() override;
};

class ParamByReferenceVectorString : public Benchmark
{
public:
    DECLARE_BENCHMARK(ParamByReferenceVectorString);
private:
    using Vector = std::vector<std::string>;
    size_t callByReference(const Vector & values) const __attribute__((noinline));
    size_t onRun() override;
};

class ParamByValueVectorString : public Benchmark
{
public:
    DECLARE_BENCHMARK(ParamByValueVectorString);
private:
    using Vector = std::vector<std::string>;
    size_t callByValue(Vector values) const __attribute__((noinline));
    size_t onRun() override;
};

class ReturnByReferenceVectorString : public Benchmark
{
public:
    DECLARE_BENCHMARK(ReturnByReferenceVectorString);
private:
    using Vector = std::vector<std::string>;
    const Vector & returnByReference(Vector & values) const __attribute__((noinline));
    size_t onRun() override;
};

class ReturnByValueVectorString : public Benchmark
{
public:
    DECLARE_BENCHMARK(ReturnByValueVectorString);
private:
    using Vector = std::vector<std::string>;
    Vector returnByValue() const __attribute__((noinline));
    size_t onRun() override;
};

class ReturnByValueMultiVectorString : public Benchmark
{
public:
    DECLARE_BENCHMARK(ReturnByValueMultiVectorString);
private:
    using Vector = std::vector<std::string>;
    Vector returnByValue() const __attribute__((noinline));
    size_t onRun() override;
};

class CreateVespalibString : public Benchmark
{
public:
    DECLARE_BENCHMARK(CreateVespalibString);
private:
    size_t onRun() override;
};

class ClockSystem : public Benchmark
{
public:
    DECLARE_BENCHMARK(ClockSystem);
private:
    size_t onRun() override;
};

class ClockREALTIME : public Benchmark
{
public:
    DECLARE_BENCHMARK(ClockREALTIME);
private:
    size_t onRun() override;
};

class ClockMONOTONIC : public Benchmark
{
public:
    DECLARE_BENCHMARK(ClockMONOTONIC);
private:
    size_t onRun() override;
};

class ClockMONOTONIC_RAW : public Benchmark
{
public:
    DECLARE_BENCHMARK(ClockMONOTONIC_RAW);
    ClockMONOTONIC_RAW();
private:
    size_t onRun() override;
};

class ClockPROCESS_CPUTIME_ID : public Benchmark
{
public:
    DECLARE_BENCHMARK(ClockPROCESS_CPUTIME_ID);
private:
    size_t onRun() override;
};

class ClockTHREAD_CPUTIME_ID : public Benchmark
{
public:
    DECLARE_BENCHMARK(ClockTHREAD_CPUTIME_ID);
private:
    size_t onRun() override;
};

}