Чтобы получить значение общего перечисления:
protected Set<String> enum2set(Class<? extends Enum<?>> e) {
Enum<?>[] enums = e.getEnumConstants();
String[] names = new String[enums.length];
for (int i = 0; i < enums.length; i++) {
names[i] = enums[i].toString();
}
return new HashSet<String>(Arrays.asList(names));
}
Обратите внимание, что в приведенном выше методе вызов метода toString ().
И затем определите перечисление с таким метод toString ().
public enum MyNameEnum {
MR("John"), MRS("Anna");
private String name;
private MyNameEnum(String name) {
this.name = name;
}
public String toString() {
return this.name;
}
}
Используйте встроенное ключевое слово time
:
$ help time time: time [-p] PIPELINE Execute PIPELINE and print a summary of the real time, user CPU time, and system CPU time spent executing PIPELINE when it terminates. The return status is the return status of PIPELINE. The `-p' option prints the timing summary in a slightly different format. This uses the value of the TIMEFORMAT variable as the output format.
Пример:
$ time sleep 2
real 0m2.009s user 0m0.000s sys 0m0.004s
Для построчного измерения дельты попробуйте gnomon .
Утилита командной строки, немного похожая на ts moreutils, для добавления информации о временной метке к стандартному выводу другой команды. Полезно для длительных процессов, где вы хотите получить исторический отчет о том, что так долго.
Вы также можете использовать опции --high
и / или --medium
, чтобы указать порог длины в секундах, в течение которого гномон будет выделять метку времени красным или желтым цветом. И вы можете сделать еще несколько вещей.
#!/bin/bash
START=$(date +%s)
# do something
# start your script work here
ls -R /etc > /tmp/x
rm -f /tmp/x
# your logic ends here
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"
Вы можете получить гораздо более подробную информацию, чем встроенная в bash time
(которую упоминает Роберт Гэмбл), используя time (1) . Обычно это /usr/bin/time
.
Примечание редактора: чтобы убедиться, что вы вызываете внешнюю утилиту time
, а не ключевое слово time
вашей оболочки , используйте ее как /usr/bin/time
.
time
- это POSIX-мандатная утилита , но единственная опция, которую требуется поддерживать, это -p
.
Определенные платформы реализуют определенные нестандартные расширения: -v
работает с утилитой GNU time
, как показано ниже (вопрос помечен linux ); реализация BSD / macOS использует -l
для получения аналогичных результатов - см. man 1 time
. sup>
Пример подробного вывода:
$ /usr/bin/time -v sleep 1
Command being timed: "sleep 1"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 1%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.05
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): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 210
Voluntary context switches: 2
Involuntary context switches: 1
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
Если вы собираетесь использовать время позже для вычисления, узнайте, как использовать опцию -f
в /usr/bin/time
для вывода кода , который экономит время. Вот некоторый код, который я недавно использовал, чтобы получить и отсортировать время выполнения целого класса студенческих программ:
fmt="run { date = '$(date)', user = '$who', test = '$test', host = '$(hostname)', times = { user = %U, system = %S, elapsed = %e } }"
/usr/bin/time -f "$fmt" -o $timefile command args...
Позже я соединил все файлы $timefile
и перенаправил вывод в Lua интерпретатор . Вы можете сделать то же самое с Python или Bash или любой другой ваш любимый синтаксис. Я люблю эту технику.
Если вы хотите большей точности, используйте %N
с date
(и используйте bc
для diff, потому что $(())
обрабатывает только целые числа).
Вот как это сделать:
start=$(date +%s.%N)
# do some stuff here
dur=$(echo "$(date +%s.%N) - $start" | bc)
printf "Execution time: %.6f seconds" $dur
Пример:
start=$(date +%s.%N); \
sleep 0.1s; \
dur=$(echo "$(date +%s.%N) - $start" | bc); \
printf "Execution time: %.6f seconds\n" $dur
Результат:
Execution time: 0.104623 seconds
Если вам нужна только точность с точностью до секунды, вы можете использовать встроенную переменную $SECONDS
, которая подсчитывает количество секунд, в течение которых была запущена оболочка.
while true; do
start=$SECONDS
some_long_running_command
duration=$(( SECONDS - start ))
echo "This run took $duration seconds"
if some_condition; then break; fi
done
Вы можете использовать time
и подоболочку ()
:
time (
for (( i=1; i<10000; i++ )); do
echo 1 >/dev/null
done
)
Или в одной оболочке {}
:
time {
for (( i=1; i<10000; i++ )); do
echo 1 >/dev/null
done
}
Выход
$ > g++ -lpthread perform.c -o per
$ > time ./per
вывод >>
real 0m0.014s
user 0m0.010s
sys 0m0.002s
Одним из возможных простых методов (которые могут не соответствовать потребностям разных пользователей) является использование оболочки PROMPT. Это простое решение, которое может быть полезно в некоторых случаях. Вы можете использовать функцию подсказки bash, как в примере ниже:
export PS1='[\t \u@\h]\Приведенная выше команда приведет к изменению приглашения оболочки на:
[HH:MM:SS username@hostname]$Каждый раз, когда вы запускаете команду ( или нажмите Enter), возвращаясь к приглашению оболочки, в приглашении будет отображаться текущее время.
отмечает:
1) имейте в виду, что если вы подождали некоторое время, прежде чем набрать следующую команду, то это время необходимо учитывать, то есть время в приглашении оболочки отображается метка времени, когда отображалось приглашение оболочки, а не при вводе команды. некоторые пользователи предпочитают нажимать клавишу Enter, чтобы получить новое приглашение с новой отметкой времени, прежде чем они будут готовы к следующей команде.
2) Существуют и другие доступные опции и модификаторы, которые можно использовать для изменения приглашения bash, см. (Man bash) для получения более подробной информации.
Приведенная выше команда приведет к изменению приглашения оболочки на:
[HH:MM:SS username@hostname]$
Каждый раз, когда вы запускаете команду ( или нажмите Enter), возвращаясь к приглашению оболочки, в приглашении будет отображаться текущее время.
отмечает:
1) имейте в виду, что если вы подождали некоторое время, прежде чем набрать следующую команду, то это время необходимо учитывать, то есть время в приглашении оболочки отображается метка времени, когда отображалось приглашение оболочки, а не при вводе команды. некоторые пользователи предпочитают нажимать клавишу Enter, чтобы получить новое приглашение с новой отметкой времени, прежде чем они будут готовы к следующей команде.
2) Существуют и другие доступные опции и модификаторы, которые можно использовать для изменения приглашения bash, см. (Man bash) для получения более подробной информации.