Общее время выполнения против суммы единственного времени выполнения
Забота! делительная сумма N округляется время выполнения неточно!
Вместо этого мы могли бы разделить общее время выполнения N итерации (по N)
avg_time_alt() {
local -i n=$1
local foo real sys user
shift
(($# > 0)) || return;
{ read foo real; read foo user; read foo sys ;} < <(
{ time -p for((;n--;)){ "$@" &>/dev/null ;} ;} 2>&1
)
printf "real: %.5f\nuser: %.5f\nsys : %.5f\n" $(
bc -l <<<"$real/$n;$user/$n;$sys/$n;" )
}
Примечание: Используетсяbc
вместо awk
для вычисления среднего.Для этого мы создали бы временный файл bc
:
printf >/tmp/test-pi.bc "scale=%d;\npi=4*a(1);\nquit\n" 60
. Это вычислило бы ¶
с 60 десятичными знаками и затем тихо завершилось.(Вы можете адаптировать количество десятичных знаков для вашего хоста.)
Демо:
avg_time_alt 1000 sleep .001
real: 0.00195
user: 0.00008
sys : 0.00016
avg_time_alt 1000 bc -ql /tmp/test-pi.bc
real: 0.00172
user: 0.00120
sys : 0.00058
Где Функция Codeforester будет anser:
avg_time 1000 sleep .001
real 0.000000
user 0.000000
sys 0.000000
avg_time 1000 bc -ql /tmp/test-pi.bc
real 0.000000
user 0.000000
sys 0.000000
Альтернатива, вдохновленная ответом Чоробы с использованием Linux's /proc
Хорошо, вы можете рассмотреть:
avgByProc() {
local foo start end n=$1 e=$1 values times
shift;
export n;
{
read foo;
read foo;
read foo foo start foo
} < /proc/timer_list;
mapfile values < <(
for((;n--;)){ "$@" &>/dev/null;}
read -a endstat < /proc/self/stat
{
read foo
read foo
read foo foo end foo
} </proc/timer_list
printf -v times "%s/100/$e;" ${endstat[@]:13:4}
bc -l <<<"$[end-start]/10^9/$e;$times"
)
printf -v fmt "%-7s: %%.5f\\n" real utime stime cutime cstime
printf "$fmt" ${values[@]}
}
Это основано на /proc
:
man 5 proc | grep [su]time\\\|timer.list | sed 's/^/> /'
(14) utime %lu
(15) stime %lu
(16) cutime %ld
(17) cstime %ld
/proc/timer_list (since Linux 2.6.21)
Тогда сейчас:
avgByProc 1000 sleep .001
real : 0.00242
utime : 0.00015
stime : 0.00021
cutime : 0.00082
cstime : 0.00020
Где utime
и stime
представляют время пользователя и системное время для самого себя и cutime
и cstime
представляют дочернее пользовательское время и дочернее системное время , которые наиболее интересны .
Примечание: В этом случае (sleep
) команда не будет использовать много ресурсов.
avgByProc 1000 bc -ql /tmp/test-pi.bc
real : 0.00175
utime : 0.00015
stime : 0.00025
cutime : 0.00108
cstime : 0.00032
Это станет более понятным ... Конечно,как доступ к timer_list
и self/stat
последовательно, но не атомарно , различия между real
(на основе наносекунд) и c?[su]time
(основано на галочки т.е.: 1/100-ая сек) может появиться!