Измерение производительности с помощью оболочки
Как вычесть время и показать секунды или миллисекунды?
begin_time=$(date)
- запустить что-то, чтобы (быстро, просто и неформально) проверить производительность
echo $(date) - $begin_time
конечно не работает, как это сделать?
4 ответа
Bash имеет встроенную функцию для этого называется time
, Просто добавьте его к любой команде, и это будет время, необходимое для выполнения команды. Для получения дополнительной информации см. help time
:)
[user@sol ~]$ time sleep 2
real 0m2.002s
user 0m0.002s
sys 0m0.000s
Zsh имеет аналогичный встроенный также называется time
хотя нет справочной страницы для help time
, Вот пример вывода:
[sol ~]$ time sleep 2
sleep 2 0.00s user 0.00s system 0% cpu 2.003 total
В добавок к time
встроенный, существует /usr/bin/time
, что часто бывает более полезным.
walt@bat:~(0)$ /usr/bin/time sleep 2
0.00user 0.00system 0:02.04elapsed 0%CPU (0avgtext+0avgdata 1756maxresident)k
80inputs+0outputs (1major+73minor)pagefaults 0swaps
walt@bat:~(0)$ /usr/bin/time -v sleep 2
Command being timed: "sleep 2"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1828
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 73
Voluntary context switches: 2
Involuntary context switches: 0
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
walt@bat:~(0)$
Или, если вы действительно хотите сделать это вручную, прочитайте man date
и использовать date +%s.%N
(%s = секунды с начала эпохи, %N = наносекунды)
Если вы используете bash
или же zsh
оболочки, и нужно только разрешение секунд, тогда вы можете использовать их SECONDS
переменная оболочки От man bash
:
SECONDS Each time this parameter is referenced, the number of seconds since shell invocation is returned. If a value is assigned to SECONDS, the value returned upon subsequent references is the number of seconds since the assignment plus the value assigned.
Таким образом, если вы назначаете нулевое значение перед выполнением вашей команды (или последовательности команд), вычитание выполняется для вас.
Ex.
$ SECONDS=0 && sleep 2 && echo $SECONDS
2
Что интересно, ksh93
имеет SECONDS
таймер, но, кажется, обеспечивает разрешение в миллисекундах:
$ ksh
$ SECONDS=0 && sleep 2 && echo $SECONDS
2.002
(Раковина Корн - которая предшествует bash
а также zsh
- в более общем случае способен обрабатывать нецелую арифметику оболочки.)
Исправление вашего кода
(при условии, что вы используете Bash)
begin_time=$(date +%s) # Get seconds since Unix epoch.
sleep 2 # For example
echo $(($(date +%s) - begin_time)) seconds
Это должно вывести 2 seconds
,
(NB Обычно вы должны заключать в кавычки все расширения, но эти значения гарантированно будут целыми числами.)
Проблемы с вашим кодом
begin_time= date
- Для назначения вывода команды переменной, синтаксис
variable=$(command)
, То, как вы это написали, это назоветdate
сbegin_time
как переменная окружения - совсем не то, что вы хотите. date
вывод зависит от локали. Вот почему я использую время Unix вместо.
echo date - $(begin_time)
- Это не в арифметическом контексте, поэтому знак минус рассматривается как строка вместо оператора. использование
$((expression))
, - Чтобы получить вывод команды (подстановка команды), используйте
$(command)
- Чтобы получить значение переменной (подстановка параметров), используйте
$variable
или же${variable}
,