Здравствуйте!При использовании команды time --format хочу вывод времени в милисекундах при форматированном выводе.
Если использовать команду без аргументов, команда выводит следующим образом _и_такой_вывод_меня_устраивает_:
# time ./my_prog < input.txt
> real 0m0,058s
> user 0m0,019s
> sys 0m0,040sНо для использования флагов, необходимо использовать абсолютный путь, но от этого меняется формат вывода по default как указано в man 1 time (переменная окружения $TIME не задана), а точность указывается на один порядок меньше:
# /bin/time ./my_prog < input.txt
> 0.02user 0.02system 0:00.05elapsed 96%CPU (0avgtext+0avgdata 2428maxresident)k
> 0inputs+0outputs (0major+302minor)pagefaults 0swapsДалее проделываю использую флаги -p или -f и вывод тоже с точностью на порядок меньше:
# /bin/time -p ./my_prog < input.txt
> real 0.05
> user 0.02
> sys 0.03# /bin/time -f "real\t%e\nuser\t%U\nsys\t%S" ./my_prog < input.txt
> real 0.05
> user 0.02
> sys 0.03#
>[оверквотинг удален]
> на порядок меньше:
> # /bin/time -p ./my_prog < input.txt
>> real 0.05
>> user 0.02
>> sys 0.03
> # /bin/time -f "real\t%e\nuser\t%U\nsys\t%S" ./my_prog < input.txt
>> real 0.05
>> user 0.02
>> sys 0.03
> #и снова третье сентября
-f "real %6.3f\nuser %6.3f\nsys %6.3f\n"А вообще, какую time и в какой ОС используете?
> -f "real %6.3f\nuser %6.3f\nsys %6.3f\n"Не работает, что естественно. "A percent sign (`%') in the format string causes the character to be interpreted as a resource specifier, which is similar to the formatting characters in the printf(3) function."
> А вообще, какую time и в какой ОС используете?
Linux. Lubuntu. В теме Unix стоит. :)
В моей системе GNU time 1.7 .
Скачал исходный текст этой программы с
https://ftp.gnu.org/gnu/time/Там точность жёстко забита в 2 цифры после точки:
case 'S': /* System time. */
fprintf (fp, "%ld.%02ld",
resp->ru.ru_stime.tv_sec,
resp->ru.ru_stime.TV_MSEC / 10);
break;
case 'U': /* User time. */
fprintf (fp, "%ld.%02ld",
resp->ru.ru_utime.tv_sec,
resp->ru.ru_utime.TV_MSEC / 10);
break;так что, надо программу модифицировать.
Или использовать Python:from datetime import datetime
date_start = datetime.now()Что- то запускаете
print('Продолжительность работы ', datetime.now() - date_start)
> В моей системе GNU time 1.7 .
> Скачал исходный текст этой программы с
> https://ftp.gnu.org/gnu/time/
> Там точность жёстко забита в 2 цифры после точки:Тоже глянул. Действительно. А ещё оказывается есть time как shell keyword, которое вшито в ядро и оно умеет в ms. А есть /bin/time -- отдельный бинарник. В итоге, это две разные команды.
Спасибо большое!
>А ещё оказывается есть time как shell keyword, которое
> вшито в ядро и оно умеет в ms. А есть /bin/time
> -- отдельный бинарник. В итоге, это две разные команды.у меня:
$ type time
time является /usr/bin/timeто есть в моей системе нет time как команды shell .
Зато есть команда shell 'times':
"times Print the accumulated user and system times for the shell and for pro‐
cesses run from the shell."Проверим:
$ times date
0m0.039s 0m0.005s
0m0.000s 0m0.000sРаботает.
> у меня:
> $ type time
> time является /usr/bin/timeУ меня:
$ type time
time is a shell keyword$ man bash
...
RESERVED WORDS
Reserved words are words that have a special meaning to the shell. The follow‐
ing words are recognized as reserved when unquoted and either the first word of
a command (see SHELL GRAMMAR below), the third word of a case or select command
(only in is valid), or the third word of a for command (only in and do are
valid):! case coproc do done elif else esac fi for function if in select then until
while { } time [[ ]]q
...> то есть в моей системе нет time как команды shell .
> Зато есть команда shell 'times':$time sleep 3
real 0m3,012s
user 0m0,003s
sys 0m0,009s$ /bin/time -p sleep 3
real 3.00
user 0.00
sys 0.00$times sleep 3
0m0,353s 0m0,287s
0m19,345s 0m4,564sЧто-то эта команда другое делает. Не хочу разбираться. :-)
Почитать про сам time, который is shell keyword, можно так:
help timeМеня вполне устраивает по своему результату конструкция:
$time ./my_prog < input.txt > /dev/nullНо проблема в том, что в рамках скрипта #!/bin/sh, почему-то срабатывает /bin/time...
Да, times не для хронометража.
А какая оболочка?
Запустите
echo $SHELLА сценарии запускать можно с шебангом
#!/bin/bashможет тогда сработает. А если не получится - в принципе несложно модифицировать GNU time, исходный текст же есть. Надо только установить компилятор (gcc), build-essentials, make.
> А сценарии запускать можно с шебангом
> #!/bin/bashДа, так и сделал. Заработало, но не всё гладко.
Есть скрипт runtest.sh, в нём есть уже известная строка:
time ./my_prog < input.txt > /dev/nullПроблема что когда конвеером передаю в less:
$ ./runtest | lessВо время листинга (j, k, gg, G) исчезают строки которые вернула команда time. Вывод команды явно идёт не в stdout. Есть какая-то возможность определить какой номер потока у неё (если он, конечно, есть)?
> Во время листинга (j, k, gg, G) исчезают строки которые вернула команда
> time. Вывод команды явно идёт не в stdout. Есть какая-то возможность
> определить какой номер потока у неё (если он, конечно, есть)?У /bin/time выводится в stderr. Куда выводится у bash'овского time пока загадка.
190 /* Output stream, stderr by default. */
191 static FILE *outfp;
...
650 outfp = stderr;
> Куда выводится у bash'овского time пока загадка.Проверил исходники bash, файл execute_cmd.c. Там есть подпрограмма, которая судя по всему и выводит время на экран:
static void print_formatted_time (fp, format, rs, rsf, us, usf, ss, ssf, cpu)
И я нашёл только один вызов данной подпрограммы:
1464 print_formatted_time (stderr, time_format, rs, rsf, us, usf, ss, ssf, cpu);Но при этом данная конструкция не работает:
$time echo test 2> /dev/null
testreal 0m0.000s
user 0m0.000s
sys 0m0.000s
> Но при этом данная конструкция не работает:
> $time echo test 2> /dev/nullВсё, победа! Надо было просто экранировать.
${ time echo test; } 2> /dev/null
test
$