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