====== Usage Profiling and benchmarking ======
===== Shell =====
''/usr/bin/time'' ((**NB.** not bash built-in ''time'', need explicit path)) can report total run time ("clock on the wall") and memory (''RSS'' = Resident Set Size)
/usr/bin/time -v perl -e '"a"x(1024**3);' |& grep -Pi 'max|wall'
# Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.40
# Maximum resident set size (kbytes): 1053908
==== Super Computer Slurm ====
When run with [[:tools:slurm]], eg. [[:tools:psc]]
sacct -j $jobid --format=JobID,MaxRSS,AveRSS,TotalCPU,Elapsed
==== hyperfine ====
For smaller jobs, ''hyperfine'' runs many time for a more rigorous estimate.
hyperfine 'sleep .5' 'sleep .55'
Benchmark 1: sleep .5
Time (mean ± σ): 502.3 ms ± 0.6 ms [User: 1.6 ms, System: 0.8 ms]
Range (min … max): 501.7 ms … 503.2 ms 10 runs
Benchmark 2: sleep .55
Time (mean ± σ): 552.6 ms ± 0.5 ms [User: 1.5 ms, System: 1.0 ms]
Range (min … max): 551.8 ms … 553.4 ms 10 runs
Summary
sleep .5 ran
1.10 ± 0.00 times faster than sleep .55
===== R =====
[[:tools:R]] can use ''microbenchmark''
microbenchmark::microbenchmark(sqrt100 = sqrt(runif(100)))
#Unit: microseconds
# expr min lq mean median uq max neval
# sqrt100 5.769 5.911 6.82513 6.071 6.445 46.451 100
===== python =====
import timeit
timeit.timeit('numpy.sqrt(numpy.random.uniform(size=100))',
setup='import numpy')
# 3.9988546459935606