File: test_mode.cpp

package info (click to toggle)
scipy 1.16.0-1exp7
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 234,820 kB
  • sloc: cpp: 503,145; python: 344,611; ansic: 195,638; javascript: 89,566; fortran: 56,210; cs: 3,081; f90: 1,150; sh: 848; makefile: 785; pascal: 284; csh: 135; lisp: 134; xml: 56; perl: 51
file content (130 lines) | stat: -rw-r--r-- 4,151 bytes parent folder | download | duplicates (10)
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
//  (C) Copyright Nick Thompson and Matt Borland 2020.
//  Use, modification and distribution are subject to 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)

#include <random>
#include <boost/math/statistics/univariate_statistics.hpp>
#include <benchmark/benchmark.h>

template <class Z>
void test_mode(benchmark::State& state)
{
    using boost::math::statistics::sorted_mode;
    
    std::random_device rd;
    std::mt19937_64 mt(rd());
    std::uniform_int_distribution<> dist {1, 10};

    auto gen = [&dist, &mt](){return dist(mt);};

    std::vector<Z> v(state.range(0));
    std::generate(v.begin(), v.end(), gen);

    for (auto _ : state)
    {
        std::vector<Z> modes;
        benchmark::DoNotOptimize(sorted_mode(v.begin(), v.end(), std::back_inserter(modes)));
    }

    state.SetComplexityN(state.range(0));
}

template <class Z>
void sequential_test_mode(benchmark::State& state)
{
    using boost::math::statistics::sorted_mode;

    std::vector<Z> v(state.range(0));
    
    size_t current_num {1};
    // produces {1, 2, 3, 4, 5...}
    for(size_t i {}; i < v.size(); ++i)
    {
        v[i] = current_num;
        ++current_num;
    }

    for (auto _ : state)
    {
        std::vector<Z> modes;
        benchmark::DoNotOptimize(sorted_mode(v, std::back_inserter(modes)));
    }

    state.SetComplexityN(state.range(0));
}

template <class Z>
void sequential_pairs_test_mode(benchmark::State& state)
{
    using boost::math::statistics::sorted_mode;

    std::vector<Z> v(state.range(0));
    
    size_t current_num {1};
    size_t current_num_counter {};
    // produces {1, 1, 2, 2, 3, 3, ...}
    for(size_t i {}; i < v.size(); ++i)
    {
        v[i] = current_num;
        ++current_num_counter;
        if(current_num_counter > 2)
        {
            ++current_num;
            current_num_counter = 0;
        }
    }

    for (auto _ : state)
    {
        std::vector<Z> modes;
        benchmark::DoNotOptimize(sorted_mode(v, std::back_inserter(modes)));
    }

    state.SetComplexityN(state.range(0));
}

template <class Z>
void sequential_multiple_test_mode(benchmark::State& state)
{
    using boost::math::statistics::sorted_mode;

    std::vector<Z> v(state.range(0));
    
    size_t current_num {1};
    size_t current_num_counter {};
    // produces {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, ...}
    for(size_t i {}; i < v.size(); ++i)
    {
        v[i] = current_num;
        ++current_num_counter;
        if(current_num_counter > current_num)
        {
            ++current_num;
            current_num_counter = 0;
        }
    }

    for (auto _ : state)
    {
        std::vector<Z> modes;
        benchmark::DoNotOptimize(sorted_mode(v, std::back_inserter(modes)));
    }

    state.SetComplexityN(state.range(0));
}

BENCHMARK_TEMPLATE(test_mode, int32_t)->RangeMultiplier(2)->Range(1<<1, 1<<22)->Complexity();
BENCHMARK_TEMPLATE(test_mode, int64_t)->RangeMultiplier(2)->Range(1<<1, 1<<22)->Complexity();
BENCHMARK_TEMPLATE(test_mode, uint32_t)->RangeMultiplier(2)->Range(1<<1, 1<<22)->Complexity();
BENCHMARK_TEMPLATE(sequential_test_mode, int32_t)->RangeMultiplier(2)->Range(1<<1, 1<<22)->Complexity();
BENCHMARK_TEMPLATE(sequential_test_mode, int64_t)->RangeMultiplier(2)->Range(1<<1, 1<<22)->Complexity();
BENCHMARK_TEMPLATE(sequential_test_mode, uint32_t)->RangeMultiplier(2)->Range(1<<1, 1<<22)->Complexity();
BENCHMARK_TEMPLATE(sequential_pairs_test_mode, int32_t)->RangeMultiplier(2)->Range(1<<1, 1<<22)->Complexity();
BENCHMARK_TEMPLATE(sequential_pairs_test_mode, int64_t)->RangeMultiplier(2)->Range(1<<1, 1<<22)->Complexity();
BENCHMARK_TEMPLATE(sequential_pairs_test_mode, uint32_t)->RangeMultiplier(2)->Range(1<<1, 1<<22)->Complexity();
BENCHMARK_TEMPLATE(sequential_multiple_test_mode, int32_t)->RangeMultiplier(2)->Range(1<<1, 1<<22)->Complexity();
BENCHMARK_TEMPLATE(sequential_multiple_test_mode, int64_t)->RangeMultiplier(2)->Range(1<<1, 1<<22)->Complexity();
BENCHMARK_TEMPLATE(sequential_multiple_test_mode, uint32_t)->RangeMultiplier(2)->Range(1<<1, 1<<22)->Complexity();

BENCHMARK_MAIN();