#!/usr/bin/env python3 # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """ A simple micro benchmark script which prints the speedup when using Process.oneshot() ctx manager. See: https://github.com/giampaolo/psutil/issues/799 """ from __future__ import division from __future__ import print_function import sys import textwrap import timeit import psutil ITERATIONS = 1000 # The list of Process methods which gets collected in one shot and # as such get advantage of the speedup. names = [ 'cpu_times', 'cpu_percent', 'memory_info', 'memory_percent', 'ppid', 'parent', ] if psutil.POSIX: names.append('uids') names.append('username') if psutil.LINUX: names += [ # 'memory_full_info', # 'memory_maps', 'cpu_num', 'cpu_times', 'gids', 'name', 'num_ctx_switches', 'num_threads', 'ppid', 'status', 'terminal', 'uids', ] elif psutil.BSD: names = [ 'cpu_times', 'gids', 'io_counters', 'memory_full_info', 'memory_info', 'name', 'num_ctx_switches', 'ppid', 'status', 'terminal', 'uids', ] if psutil.FREEBSD: names.append('cpu_num') elif psutil.SUNOS: names += [ 'cmdline', 'gids', 'memory_full_info', 'memory_info', 'name', 'num_threads', 'ppid', 'status', 'terminal', 'uids', ] elif psutil.MACOS: names += [ 'cpu_times', 'create_time', 'gids', 'memory_info', 'name', 'num_ctx_switches', 'num_threads', 'ppid', 'terminal', 'uids', ] elif psutil.WINDOWS: names += [ 'num_ctx_switches', 'num_threads', # dual implementation, called in case of AccessDenied 'num_handles', 'cpu_times', 'create_time', 'num_threads', 'io_counters', 'memory_info', ] names = sorted(set(names)) setup = textwrap.dedent(""" from __main__ import names import psutil def call_normal(funs): for fun in funs: fun() def call_oneshot(funs): with p.oneshot(): for fun in funs: fun() p = psutil.Process() funs = [getattr(p, n) for n in names] """) def main(): print("%s methods involved on platform %r (%s iterations, psutil %s):" % ( len(names), sys.platform, ITERATIONS, psutil.__version__)) for name in sorted(names): print(" " + name) # "normal" run elapsed1 = timeit.timeit( "call_normal(funs)", setup=setup, number=ITERATIONS) print("normal: %.3f secs" % elapsed1) # "one shot" run elapsed2 = timeit.timeit( "call_oneshot(funs)", setup=setup, number=ITERATIONS) print("onshot: %.3f secs" % elapsed2) # done if elapsed2 < elapsed1: print("speedup: +%.2fx" % (elapsed1 / elapsed2)) elif elapsed2 > elapsed1: print("slowdown: -%.2fx" % (elapsed2 / elapsed1)) else: print("same speed") if __name__ == '__main__': main()