diff options
author | Giampaolo Rodola <g.rodola@gmail.com> | 2019-02-27 03:13:15 +0100 |
---|---|---|
committer | Giampaolo Rodola <g.rodola@gmail.com> | 2019-02-27 03:13:15 +0100 |
commit | 0a28fa0cb19e7af2cf03325a22340fa0d2d0ad18 (patch) | |
tree | 058966abdc3a1c52f4efb14bfd41eccc17b441b3 | |
parent | d6f5cc7eca2dad63acaba5db6ac846b7b986443f (diff) | |
download | psutil-0a28fa0cb19e7af2cf03325a22340fa0d2d0ad18.tar.gz |
add script for to benchmark API calls
-rw-r--r-- | Makefile | 8 | ||||
-rw-r--r-- | scripts/internal/print_api_speed.py | 92 |
2 files changed, 97 insertions, 3 deletions
@@ -252,9 +252,11 @@ print-announce: ## Print announce of new release. print-timeline: ## Print releases' timeline. @$(TEST_PREFIX) $(PYTHON) scripts/internal/print_timeline.py -print-access-denied: -# ${MAKE} install - $(TEST_PREFIX) $(PYTHON) scripts/internal/procs_access_denied.py +print-access-denied: ## Print AD exceptions + @$(TEST_PREFIX) $(PYTHON) scripts/internal/print_access_denied.py + +print-api-speed: ## Benchmark all API calls + @$(TEST_PREFIX) $(PYTHON) scripts/internal/print_api_speed.py # =================================================================== # Misc diff --git a/scripts/internal/print_api_speed.py b/scripts/internal/print_api_speed.py new file mode 100644 index 00000000..24b98f11 --- /dev/null +++ b/scripts/internal/print_api_speed.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python + +# 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. + +"""Benchmark all API calls. + +$ python scripts/internal/print_api_speed.py +SYSTEM APIS + boot_time 0.000127 secs + cpu_count 0.000034 secs + cpu_count (cores) 0.000279 secs + cpu_freq 0.000438 secs + ... + +PROCESS APIS + cmdline 0.000027 secs + connections 0.000056 secs + cpu_affinity 0.000014 secs + cpu_num 0.000054 secs + cpu_percent 0.000077 secs + ... +""" + +from __future__ import print_function, division +from timeit import default_timer as timer +import os + +import psutil + + +SORT_BY_NAME = 0 # <- toggle this +timings = [] + + +def print_timings(): + timings.sort(key=lambda x: x[0 if SORT_BY_NAME else 1]) + while timings[:]: + title, elapsed = timings.pop(0) + print(" %-30s %f secs" % (title, elapsed)) + + +def timecall(title, fun, *args, **kw): + t = timer() + fun(*args, **kw) + elapsed = timer() - t + timings.append((title, elapsed)) + + +def main(): + print("SYSTEM APIS") + timecall('cpu_count', psutil.cpu_count) + timecall('cpu_count (cores)', psutil.cpu_count, logical=False) + timecall('cpu_times', psutil.cpu_times) + timecall('cpu_percent', psutil.cpu_percent, interval=0) + timecall('cpu_times_percent', psutil.cpu_times_percent, interval=0) + timecall('cpu_stats', psutil.cpu_stats) + timecall('cpu_freq', psutil.cpu_freq) + timecall('virtual_memory', psutil.virtual_memory) + timecall('swap_memory', psutil.swap_memory) + timecall('disk_partitions', psutil.disk_partitions) + timecall('disk_usage', psutil.disk_usage, os.getcwd()) + timecall('disk_io_counters', psutil.disk_io_counters) + timecall('net_io_counters', psutil.net_io_counters) + timecall('net_connections', psutil.net_connections) + timecall('net_if_addrs', psutil.net_if_addrs) + timecall('net_if_stats', psutil.net_if_stats) + timecall('sensors_temperatures', psutil.sensors_temperatures) + timecall('sensors_fans', psutil.sensors_fans) + timecall('sensors_battery', psutil.sensors_battery) + timecall('boot_time', psutil.boot_time) + timecall('users', psutil.users) + timecall('pids', psutil.pids) + timecall('pid_exists', psutil.pid_exists, os.getpid()) + timecall('process_iter (all)', lambda: list(psutil.process_iter())) + print_timings() + + print("\nPROCESS APIS") + ignore = ['send_signal', 'suspend', 'resume', 'terminate', 'kill', 'wait', + 'as_dict', 'parent', 'parents', 'memory_info_ex', 'oneshot', + 'pid', 'rlimit'] + p = psutil.Process() + for name in sorted(dir(p)): + if not name.startswith('_') and name not in ignore: + fun = getattr(p, name) + timecall(name, fun) + print_timings() + + +if __name__ == '__main__': + main() |