Скрипт для определения среднего времени выполнения программы

#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. Спасибо за все варианты! Я проверю их и посмотрю, какой из них лучший.