xref: /llvm-project/third-party/benchmark/bindings/python/google_benchmark/example.py (revision a5b797172cc902db166e9a695716fb81405f86e4)
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
41f98ee40fSTobias Hieta
425dda2efdSMircea Trofin@benchmark.register
435dda2efdSMircea Trofindef pause_timing(state):
445dda2efdSMircea Trofin    """Pause timing every iteration."""
455dda2efdSMircea Trofin    while state:
465dda2efdSMircea Trofin        # Construct a list of random ints every iteration without timing it
475dda2efdSMircea Trofin        state.pause_timing()
485dda2efdSMircea Trofin        random_list = [random.randint(0, 100) for _ in range(100)]
495dda2efdSMircea Trofin        state.resume_timing()
505dda2efdSMircea Trofin        # Time the in place sorting algorithm
515dda2efdSMircea Trofin        random_list.sort()
525dda2efdSMircea Trofin
535dda2efdSMircea Trofin
545dda2efdSMircea Trofin@benchmark.register
555dda2efdSMircea Trofindef skipped(state):
565dda2efdSMircea Trofin    if True:  # Test some predicate here.
575dda2efdSMircea Trofin        state.skip_with_error("some error")
585dda2efdSMircea Trofin        return  # NOTE: You must explicitly return, or benchmark will continue.
595dda2efdSMircea Trofin
605dda2efdSMircea Trofin    ...  # Benchmark code would be here.
615dda2efdSMircea Trofin
625dda2efdSMircea Trofin
635dda2efdSMircea Trofin@benchmark.register
645dda2efdSMircea Trofindef manual_timing(state):
655dda2efdSMircea Trofin    while state:
665dda2efdSMircea Trofin        # Manually count Python CPU time
675dda2efdSMircea Trofin        start = time.perf_counter()  # perf_counter_ns() in Python 3.7+
685dda2efdSMircea Trofin        # Something to benchmark
695dda2efdSMircea Trofin        time.sleep(0.01)
705dda2efdSMircea Trofin        end = time.perf_counter()
715dda2efdSMircea Trofin        state.set_iteration_time(end - start)
725dda2efdSMircea Trofin
735dda2efdSMircea Trofin
745dda2efdSMircea Trofin@benchmark.register
755dda2efdSMircea Trofindef custom_counters(state):
76*a5b79717SMircea Trofin    """Collect custom metric using benchmark.Counter."""
775dda2efdSMircea Trofin    num_foo = 0.0
785dda2efdSMircea Trofin    while state:
795dda2efdSMircea Trofin        # Benchmark some code here
805dda2efdSMircea Trofin        pass
815dda2efdSMircea Trofin        # Collect some custom metric named foo
825dda2efdSMircea Trofin        num_foo += 0.13
835dda2efdSMircea Trofin
845dda2efdSMircea Trofin    # Automatic Counter from numbers.
855dda2efdSMircea Trofin    state.counters["foo"] = num_foo
865dda2efdSMircea Trofin    # Set a counter as a rate.
875dda2efdSMircea Trofin    state.counters["foo_rate"] = Counter(num_foo, Counter.kIsRate)
885dda2efdSMircea Trofin    #  Set a counter as an inverse of rate.
89*a5b79717SMircea Trofin    state.counters["foo_inv_rate"] = Counter(
90*a5b79717SMircea Trofin        num_foo, Counter.kIsRate | Counter.kInvert
91*a5b79717SMircea Trofin    )
925dda2efdSMircea Trofin    # Set a counter as a thread-average quantity.
935dda2efdSMircea Trofin    state.counters["foo_avg"] = Counter(num_foo, Counter.kAvgThreads)
945dda2efdSMircea Trofin    # There's also a combined flag:
955dda2efdSMircea Trofin    state.counters["foo_avg_rate"] = Counter(num_foo, Counter.kAvgThreadsRate)
965dda2efdSMircea Trofin
975dda2efdSMircea Trofin
985dda2efdSMircea Trofin@benchmark.register
995dda2efdSMircea Trofin@benchmark.option.measure_process_cpu_time()
1005dda2efdSMircea Trofin@benchmark.option.use_real_time()
1015dda2efdSMircea Trofindef with_options(state):
1025dda2efdSMircea Trofin    while state:
1035dda2efdSMircea Trofin        sum(range(1_000_000))
1045dda2efdSMircea Trofin
1055dda2efdSMircea Trofin
1065dda2efdSMircea Trofin@benchmark.register(name="sum_million_microseconds")
1075dda2efdSMircea Trofin@benchmark.option.unit(benchmark.kMicrosecond)
108a290770fSMircea Trofindef with_options2(state):
1095dda2efdSMircea Trofin    while state:
1105dda2efdSMircea Trofin        sum(range(1_000_000))
1115dda2efdSMircea Trofin
1125dda2efdSMircea Trofin
1135dda2efdSMircea Trofin@benchmark.register
1145dda2efdSMircea Trofin@benchmark.option.arg(100)
1155dda2efdSMircea Trofin@benchmark.option.arg(1000)
1165dda2efdSMircea Trofindef passing_argument(state):
1175dda2efdSMircea Trofin    while state:
1185dda2efdSMircea Trofin        sum(range(state.range(0)))
1195dda2efdSMircea Trofin
1205dda2efdSMircea Trofin
1215dda2efdSMircea Trofin@benchmark.register
1225dda2efdSMircea Trofin@benchmark.option.range(8, limit=8 << 10)
1235dda2efdSMircea Trofindef using_range(state):
1245dda2efdSMircea Trofin    while state:
1255dda2efdSMircea Trofin        sum(range(state.range(0)))
1265dda2efdSMircea Trofin
1275dda2efdSMircea Trofin
1285dda2efdSMircea Trofin@benchmark.register
1295dda2efdSMircea Trofin@benchmark.option.range_multiplier(2)
1305dda2efdSMircea Trofin@benchmark.option.range(1 << 10, 1 << 18)
1315dda2efdSMircea Trofin@benchmark.option.complexity(benchmark.oN)
1325dda2efdSMircea Trofindef computing_complexity(state):
1335dda2efdSMircea Trofin    while state:
1345dda2efdSMircea Trofin        sum(range(state.range(0)))
1355dda2efdSMircea Trofin    state.complexity_n = state.range(0)
1365dda2efdSMircea Trofin
1375dda2efdSMircea Trofin
1385dda2efdSMircea Trofinif __name__ == "__main__":
1395dda2efdSMircea Trofin    benchmark.main()
140