Skip to content

Instantly share code, notes, and snippets.

@tlrmchlsmth
Last active November 4, 2024 15:24
Show Gist options
  • Save tlrmchlsmth/4e366ada4290a1649cef40965115a81f to your computer and use it in GitHub Desktop.
Save tlrmchlsmth/4e366ada4290a1649cef40965115a81f to your computer and use it in GitHub Desktop.
import os
import time
import asyncio
import argparse
import statistics
from typing import List
def benchmark_time_sleep(sleep_duration: float, iterations: int) -> List[float]:
durations = []
for _ in range(iterations):
start = time.perf_counter()
time.sleep(sleep_duration)
duration = time.perf_counter() - start
durations.append(duration)
return durations
def benchmark_yield(iterations: int) -> List[float]:
durations = []
for _ in range(iterations):
start = time.perf_counter()
os.sched_yield()
duration = time.perf_counter() - start
durations.append(duration)
return durations
def main():
parser = argparse.ArgumentParser(description='Benchmark time.sleep() accuracy')
parser.add_argument('sleep_duration', type=float, help='Sleep duration in seconds')
parser.add_argument('iterations', type=int, help='Number of iterations to run')
parser.add_argument('--use_yield', action='store_true')
args = parser.parse_args()
if args.use_yield:
print(f"Benchmarking os.sched_yield() for {args.iterations} iterations...")
durations = benchmark_yield(args.iterations)
else:
print(f"Benchmarking sleep({args.sleep_duration:e}) for {args.iterations} iterations...")
durations = benchmark_time_sleep(args.sleep_duration, args.iterations)
print(f"\nResults:")
print(f"Requested sleep duration: {args.sleep_duration:e}s")
print(f"Mean actual duration: {statistics.mean(durations):e}s")
print(f"Std dev: {statistics.stdev(durations):e}s")
print(f"Min duration: {min(durations):e}s")
print(f"Max duration: {max(durations):e}s")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment