15dda2efdSMircea Trofin# Copyright 2020 Google Inc. All rights reserved.
25dda2efdSMircea Trofin#
35dda2efdSMircea Trofin# Licensed under the Apache License, Version 2.0 (the "License");
45dda2efdSMircea Trofin# you may not use this file except in compliance with the License.
55dda2efdSMircea Trofin# You may obtain a copy of the License at
65dda2efdSMircea Trofin#
75dda2efdSMircea Trofin#     http://www.apache.org/licenses/LICENSE-2.0
85dda2efdSMircea Trofin#
95dda2efdSMircea Trofin# Unless required by applicable law or agreed to in writing, software
105dda2efdSMircea Trofin# distributed under the License is distributed on an "AS IS" BASIS,
115dda2efdSMircea Trofin# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
125dda2efdSMircea Trofin# See the License for the specific language governing permissions and
135dda2efdSMircea Trofin# limitations under the License.
145dda2efdSMircea Trofin"""Example of Python using C++ benchmark framework.
155dda2efdSMircea Trofin
165dda2efdSMircea TrofinTo run this example, you must first install the `google_benchmark` Python package.
175dda2efdSMircea Trofin
185dda2efdSMircea TrofinTo install using `setup.py`, download and extract the `google_benchmark` source.
195dda2efdSMircea TrofinIn the extracted directory, execute:
205dda2efdSMircea Trofin  python setup.py install
215dda2efdSMircea Trofin"""
225dda2efdSMircea Trofin
235dda2efdSMircea Trofinimport random
245dda2efdSMircea Trofinimport time
255dda2efdSMircea Trofin
265dda2efdSMircea Trofinimport google_benchmark as benchmark
275dda2efdSMircea Trofinfrom google_benchmark import Counter
285dda2efdSMircea Trofin
295dda2efdSMircea Trofin
305dda2efdSMircea Trofin@benchmark.register
315dda2efdSMircea Trofindef empty(state):
325dda2efdSMircea Trofin    while state:
335dda2efdSMircea Trofin        pass
345dda2efdSMircea Trofin
355dda2efdSMircea Trofin
365dda2efdSMircea Trofin@benchmark.register
375dda2efdSMircea Trofindef sum_million(state):
385dda2efdSMircea Trofin    while state:
395dda2efdSMircea Trofin        sum(range(1_000_000))
405dda2efdSMircea Trofin
415dda2efdSMircea Trofin@benchmark.register
425dda2efdSMircea Trofindef pause_timing(state):
435dda2efdSMircea Trofin    """Pause timing every iteration."""
445dda2efdSMircea Trofin    while state:
455dda2efdSMircea Trofin        # Construct a list of random ints every iteration without timing it
465dda2efdSMircea Trofin        state.pause_timing()
475dda2efdSMircea Trofin        random_list = [random.randint(0, 100) for _ in range(100)]
485dda2efdSMircea Trofin        state.resume_timing()
495dda2efdSMircea Trofin        # Time the in place sorting algorithm
505dda2efdSMircea Trofin        random_list.sort()
515dda2efdSMircea Trofin
525dda2efdSMircea Trofin
535dda2efdSMircea Trofin@benchmark.register
545dda2efdSMircea Trofindef skipped(state):
555dda2efdSMircea Trofin    if True:  # Test some predicate here.
565dda2efdSMircea Trofin        state.skip_with_error("some error")
575dda2efdSMircea Trofin        return  # NOTE: You must explicitly return, or benchmark will continue.
585dda2efdSMircea Trofin
595dda2efdSMircea Trofin    ...  # Benchmark code would be here.
605dda2efdSMircea Trofin
615dda2efdSMircea Trofin
625dda2efdSMircea Trofin@benchmark.register
635dda2efdSMircea Trofindef manual_timing(state):
645dda2efdSMircea Trofin    while state:
655dda2efdSMircea Trofin        # Manually count Python CPU time
665dda2efdSMircea Trofin        start = time.perf_counter()  # perf_counter_ns() in Python 3.7+
675dda2efdSMircea Trofin        # Something to benchmark
685dda2efdSMircea Trofin        time.sleep(0.01)
695dda2efdSMircea Trofin        end = time.perf_counter()
705dda2efdSMircea Trofin        state.set_iteration_time(end - start)
715dda2efdSMircea Trofin
725dda2efdSMircea Trofin
735dda2efdSMircea Trofin@benchmark.register
745dda2efdSMircea Trofindef custom_counters(state):
755dda2efdSMircea Trofin    """Collect cutom metric using benchmark.Counter."""
765dda2efdSMircea Trofin    num_foo = 0.0
775dda2efdSMircea Trofin    while state:
785dda2efdSMircea Trofin        # Benchmark some code here
795dda2efdSMircea Trofin        pass
805dda2efdSMircea Trofin        # Collect some custom metric named foo
815dda2efdSMircea Trofin        num_foo += 0.13
825dda2efdSMircea Trofin
835dda2efdSMircea Trofin    # Automatic Counter from numbers.
845dda2efdSMircea Trofin    state.counters["foo"] = num_foo
855dda2efdSMircea Trofin    # Set a counter as a rate.
865dda2efdSMircea Trofin    state.counters["foo_rate"] = Counter(num_foo, Counter.kIsRate)
875dda2efdSMircea Trofin    #  Set a counter as an inverse of rate.
885dda2efdSMircea Trofin    state.counters["foo_inv_rate"] = Counter(num_foo, Counter.kIsRate | Counter.kInvert)
895dda2efdSMircea Trofin    # Set a counter as a thread-average quantity.
905dda2efdSMircea Trofin    state.counters["foo_avg"] = Counter(num_foo, Counter.kAvgThreads)
915dda2efdSMircea Trofin    # There's also a combined flag:
925dda2efdSMircea Trofin    state.counters["foo_avg_rate"] = Counter(num_foo, Counter.kAvgThreadsRate)
935dda2efdSMircea Trofin
945dda2efdSMircea Trofin
955dda2efdSMircea Trofin@benchmark.register
965dda2efdSMircea Trofin@benchmark.option.measure_process_cpu_time()
975dda2efdSMircea Trofin@benchmark.option.use_real_time()
985dda2efdSMircea Trofindef with_options(state):
995dda2efdSMircea Trofin    while state:
1005dda2efdSMircea Trofin        sum(range(1_000_000))
1015dda2efdSMircea Trofin
1025dda2efdSMircea Trofin
1035dda2efdSMircea Trofin@benchmark.register(name="sum_million_microseconds")
1045dda2efdSMircea Trofin@benchmark.option.unit(benchmark.kMicrosecond)
105*a290770fSMircea Trofindef with_options2(state):
1065dda2efdSMircea Trofin    while state:
1075dda2efdSMircea Trofin        sum(range(1_000_000))
1085dda2efdSMircea Trofin
1095dda2efdSMircea Trofin
1105dda2efdSMircea Trofin@benchmark.register
1115dda2efdSMircea Trofin@benchmark.option.arg(100)
1125dda2efdSMircea Trofin@benchmark.option.arg(1000)
1135dda2efdSMircea Trofindef passing_argument(state):
1145dda2efdSMircea Trofin    while state:
1155dda2efdSMircea Trofin        sum(range(state.range(0)))
1165dda2efdSMircea Trofin
1175dda2efdSMircea Trofin
1185dda2efdSMircea Trofin@benchmark.register
1195dda2efdSMircea Trofin@benchmark.option.range(8, limit=8 << 10)
1205dda2efdSMircea Trofindef using_range(state):
1215dda2efdSMircea Trofin    while state:
1225dda2efdSMircea Trofin        sum(range(state.range(0)))
1235dda2efdSMircea Trofin
1245dda2efdSMircea Trofin
1255dda2efdSMircea Trofin@benchmark.register
1265dda2efdSMircea Trofin@benchmark.option.range_multiplier(2)
1275dda2efdSMircea Trofin@benchmark.option.range(1 << 10, 1 << 18)
1285dda2efdSMircea Trofin@benchmark.option.complexity(benchmark.oN)
1295dda2efdSMircea Trofindef computing_complexity(state):
1305dda2efdSMircea Trofin    while state:
1315dda2efdSMircea Trofin        sum(range(state.range(0)))
1325dda2efdSMircea Trofin    state.complexity_n = state.range(0)
1335dda2efdSMircea Trofin
1345dda2efdSMircea Trofin
1355dda2efdSMircea Trofinif __name__ == "__main__":
1365dda2efdSMircea Trofin    benchmark.main()
137