#shell #unix #timer
#оболочка #unix #таймер
Вопрос:
Я нашел частичные решения на нескольких сайтах, поэтому я собрал несколько частей вместе, но я все еще не мог понять это.
Вот что я делаю:
Я запускаю простую Java-программу из терминала, и мне нужно найти среднее время выполнения для программы.
Что я делаю, так это запускаю команду несколько раз, нахожу общее время, а затем делю это общее время на количество раз, когда я запускал программу.
Я также хотел бы получать выходные данные программы, а не отображать их в стандартном выводе.
Вот мой текущий код и выходные данные.
Shell-скрипт:
startTime=$(date %s%N)
for ((i = 0; i < $runTimes; i ))
do
java Program test.txt > /dev/null
done
endTime=$(date %s%N)
timeDiff=$(( $endTime - $startTime ))
timeAvg=$(( $timeDiff / $numTimes ))
echo "Avg Time Taken: "
echo $timeAvg
Вывод:
./run: line 12: 1305249784N: value too great for base (error token is "1305249784N")
Строка с номером 12 отключена, поскольку этот код является частью файла большего размера.
Строка под номером 12 — это строка с timeDiff
, которая вычисляется.
Я ценю любую помощь и приношу извинения, если этот вопрос избыточен или не по теме.
Ответ №1:
На моей машине я не вижу, что дает вам %N
формат для даты, поскольку значение кажется равным 7 нулям, НО это дает гораздо большее число для математической оценки, т. Е. 1305250833570000000
. Вам действительно нужна точность в наносекунду? Держу пари, если вы выберете just %s
, все будет в порядке.
В остальном вы, похоже, на правильном пути.
P.S.
Ах да, незначительный момент,
echo "Avg Time Taken: $timeAvg"
Это более простой способ достичь требуемого результата 😉
Вариант 2. Вы могли бы удалить все вычисления даты вместе и превратить свой цикл в небольшой скрипт. Затем вы можете использовать встроенную функцию оболочки
time myJavaTest.sh
Предоставит вам такие подробности, как
real 0m0.049s
user 0m0.016s
sys 0m0.015s
Я надеюсь, что это поможет.
Комментарии:
1. Спасибо за советы. Я не использовал просто %s, потому что мне нужна была точность больше, чем секунды, потому что один вызов Java-программы занимает от 8 до 15 миллисекунд. В любом случае указывать только миллисекунды, а не наносекунды? Мне нравится, как вы используете функцию time для вызова тестера. Я могу использовать это. Еще раз спасибо.
2. в —help on my date не указано ни одного параметра миллисекунды. Я бы поэкспериментировал с уменьшением размера значения %s. На самом деле вам нужны только меньшие 6-8 значений слева от строки. По модулю или просто подстрока? Или вы могли бы запустить awk для вычисления, я не думаю, что он ограничен в диапазоне чисел, которые он будет обрабатывать. Удачи.
3. дааа .. вероятно, самый простой способ — преобразовать ваше значение в значение с плавающей запятой, %s.%N, а затем использовать awk для вычисления. Кроме того, вы не можете использовать профилирование, доступное для java? И, наконец, если вы собираетесь делать это чаще, размещайте вопросы с тегами benchmarking и testing. Есть много людей, которые могут помочь по этим вопросам. Удачи!
4. Спасибо за все варианты! Я проверю их и посмотрю, какой из них лучший.