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