Перейти к содержимому

Java как засечь время выполнения функции

  • автор:

Таймер — классы Timer и TimerTask

Классы Timer и TimerTask из пакета java.util позволяют планировать запуск задания на определённое время в будущем. Вы можете создать поток, выполняющий в фоновом режиме и ожидающий заданное время. Когда время истечёт, задача, связанная с этим потоком, будет запущена. С помощью параметров можно запланировать задачу на повторяющий запуск либо на запуск по определённой дате. Вам не нужно создавать поток с помощью класса Thread, так как таймер упрощает эту задачу.

Учитывайте обстоятельство, что таймер выполняется в своём потоке и не должен задействовать UI-элементы, которые выполняются в своём потоке. Для решения этой проблемы можете использовать метод runOnUiThread() для обновления данных у компонентов.

Классы Timer и TimerTask работают в связке. Класс Timer используется для планирования выполнения задачи. Запланированная к выполнению задача должна быть экземпляром класса TimerTask. Вы сначала создаёте объект класса TimerTask, а затем планируете его запуск с помощью класса Timer.

Класс TimerTask реализует интерфейс Runnable и может быть использован для создания потока выполнения.

В классе TimerTask имеется абстрактный метод run(), который следует переопределить. Метод должен содержать исполняемый код.

Метод cancel() прерывает задание и возвращает значение true, если выполнение задания прервано.

Метод scheduleExecutionTime() возвращает время, на которое последний раз планировался запуск задания.

Как только задача создана, она планируется для выполнения объектом класса Timer.

Методы класса Timer:

  • void cancel() — прерывает поток таймера
  • int purge() — удаляет прерванные задания из очереди таймера
  • void schedule (TimerTask task, long delay) — задание task планируется к выполнению через период в миллисекундах, переданный в параметре delay
  • void schedule (TimerTask task, long delay, long period) — задание task планируется к выполнению через период в миллисекундах, переданный в параметре delay. Затем задание повторяется повторно периодически — каждые period миллисекунд
  • void schedule (TimerTask task, Date when) — задание task планируется на время, указанное в параметре when
  • void schedule(TimerTask task, Date when, long period) — задание task планируется на время, указанное в параметре when. Затем задание выполняется повторно периодически — каждые period миллисекунд
  • void scheduleAtFixedRate (TimerTask task, long delay, long period) — задание task планируется к выполнению через период в миллисекундах, переданный в параметре delay. Затем задание выполняется повторно периодически — каждые period миллисекунд. Время каждого повтора задаётся относительно первого запуска.
  • void scheduleAtFixedRate (TimerTask task, Date when, long period) — задание task планируется к выполнению на время, указанное в параметре when. Задание затем выполняется повторно периодически — каждые period миллисекунд. Время каждого повтора задаётся относительно первого запуска.

Между методами schedule() и scheduleAtFixedRate() есть небольшая разница, которая заключается в разном поведении, которое зависит от стартовой точки запуска. Так второй метод работает как startTime + iterationNumber * delayTime и помнит время запуска. А обычный метод schedule() помнит последнее время выполнения и работает по формуле lastExecutionTime + delayTime. Для быстрых операций это не сильно отличается, а при ресурсоёмких задач разница будет заметна, например, при работе сборщика мусора приложение может притормозить и следующая задача может запуститься чуть позже.

Как только объект класса Timer создан, запуск планируется вызовом его метода schedule() и его родственника (см. выше).

Если вам нужно периодически вызывать какое-нибудь событие, то воспользуйтесь следующим примером:

 public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); Timer myTimer; myTimer = new Timer(); myTimer.schedule(new TimerTask() < public void run() < timerTick(); >>, 0, 5000); // каждые 5 секунд > private void timerTick() < this.runOnUiThread(doTask); >private Runnable doTask = new Runnable() < public void run() < Toast toast = Toast.makeText(getApplicationContext(), "Мяу!", Toast.LENGTH_SHORT); toast.show(); >>; 

Через каждые пять секунд будет появляться всплывающее сообщение.

Запускаем таймер

Напишем другой пример. Подготовим разметку.

Будем использовать два варианта таймера — одиночное и периодическое срабатывание.

 package ru.alexanderklimov.timer; // Если этот код работает, его написал Александр Климов, // а если нет, то не знаю, кто его писал. import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; import java.util.Timer; import java.util.TimerTask; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.CheckBox; import android.widget.TextView; public class MainActivity extends Activity < private CheckBox mSingleShotCheckBox; private Button mStartButton, mCancelButton; private TextView mCounterTextView; private Timer mTimer; private MyTimerTask mMyTimerTask; @Override public void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSingleShotCheckBox = findViewById(R.id.checkBoxSingleShot); mStartButton = findViewById(R.id.buttonStart); mCancelButton = findViewById(R.id.buttonCancel); mCounterTextView = findViewById(R.id.textViewCounter); mStartButton.setOnClickListener(new OnClickListener() < @Override public void onClick(View arg0) < if (mTimer != null) < mTimer.cancel(); >// re-schedule timer here // otherwise, IllegalStateException of // "TimerTask is scheduled already" // will be thrown mTimer = new Timer(); mMyTimerTask = new MyTimerTask(); if (mSingleShotCheckBox.isChecked()) < // singleshot delay 1000 ms mTimer.schedule(mMyTimerTask, 1000); >else < // delay 1000ms, repeat in 5000ms mTimer.schedule(mMyTimerTask, 1000, 5000); >> >); mCancelButton.setOnClickListener(new OnClickListener() < @Override public void onClick(View v) < if (mTimer != null) < mTimer.cancel(); mTimer = null; >> >); > class MyTimerTask extends TimerTask < @Override public void run() < Calendar calendar = Calendar.getInstance(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "dd:MMMM:yyyy HH:mm:ss a", Locale.getDefault()); final String strDate = simpleDateFormat.format(calendar.getTime()); runOnUiThread(new Runnable() < @Override public void run() < mCounterTextView.setText(strDate); >>); > > > 

Генерируем случайные показания

Допустим нам нужны ежедневные показания термометра. Но мы не можем ждать весь день при написании программ. Поэтому мы можем случайным образом создавать показания с небольшим интервалом и проверить поведение приложения.

Для удобства создадим отдельный класс-утилиту.

 package ru.alexanderklimov.supercat; import java.util.Random; class Utils < private static final Random RANDOM = new Random(); static int randInt(int min, int max) < return RANDOM.nextInt((max - min) + 1) + min; >> 

Создадим в классе активности метод для генерации значений и вызовем в onCreate().

 package ru.alexanderklimov.supercat; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import java.util.Timer; import java.util.TimerTask; public class MainActivity extends AppCompatActivity < @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); setValues(); >private void setValues() < Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() < @Override public void run() < final float value = Utils.randInt(-10, 35); runOnUiThread(new Runnable() < @Override public void run() < Log.i("Info", "Value: " + value); >>); > >, 0, 3500); > > 

Java как засечь время выполнения функции

Регистрация: 03.11.2009

Сообщений: 24

Как определить время работы метода.

Вычитала на сайте, что для этого есть специальные функции. Но вот там сайт на С++. И на сайте есть код, который мне показался интересным и который я хочу реализовать на java:

long time; // засечь время time = TickCount(); // сортировка // Подсчитать время выполнения в секундах. time = TickCount() - time; cout 

Есть ли в яве какой-то метод,чтобы подсчитать время выполнения метода, как в С++ TickCount()??

_Studentka_
Посмотреть профиль
Найти ещё сообщения от _Studentka_

Сколько времени выполнялась программа (Java)

Выдает вот такое значение : 1482923121138 Как не пытался конвертировать и где только не гуглил,выход так и не нашел. Мне нужно преобразовать полученное значение в секунды. Т.е. вывести на экран время выполнения программы.

Отслеживать
задан 28 дек 2016 в 11:06
Marat Zimnurov Marat Zimnurov
554 3 3 золотых знака 8 8 серебряных знаков 28 28 бронзовых знаков

7 ответов 7

Сортировка: Сброс на вариант по умолчанию

System.currentTimeMillis() - возвращает количество миллисекунд прошедших с полуночи 1 января 1970 года, это называется UNIX-время.

Чтобы посчитать сколько времени выполнялся какой-то кусок кода, нужно посчитать разницу, т.е. что-то типа:

long time = System.currentTimeMillis(); someMethod(); // some code System.out.println(System.currentTimeMillis() - time); 

Так же часто код выполняется очень быстро, тогда надо заменить за сколько выполнится большое количество повторений этого кода.

Или не всегда за стабильное время, в этом случае надо провести несколько замеров и посчитать среднее арифметическое.

Время выполнения измерения в Java – пример Spring StopWatch

Есть два способа измерить истекшее время выполнения в Java , используя System.currentTimeinMillis () или System.nanoTime (). Эти два метода могут использоваться для измерения прошедшего времени или времени выполнения между двумя вызовами метода или событием в Java. Вычисление истекшего времени – одна из первых вещей, которую Java-программист делает, чтобы узнать, сколько секунд или миллисекунд занимает выполнение метода или сколько времени занимает конкретный блок кода. Большинство программистов на Java знакомы с System.currentTimeInMillis (), которая существует с самого начала, в то время как в Java 1.5 представлена ​​новая версия более точной утилиты измерения времени System.nanoTime, а также несколько новых функций в языке, таких как Generics , типы Enum , auto бокс и переменные аргументы или переменные . Вы можете использовать любой из них для измерения времени выполнения метода в Java. Хотя лучше использовать System.nanoTime () для более точного измерения временных интервалов.

В этом руководстве по Java-программированию мы увидим простую Java-программу для измерения времени выполнения с помощью System.nanoTime () и служебного класса StopWatch фреймворка Spring. Эта статья является продолжением моего поста, посвященного фундаментальным концепциям Java, таким как « Как сравнивать String в Java» , « Как правильно писать метод equals в Java» и « 4 способа зацикливания HashMap в Java» . Если вы еще не прочитали их, вы можете найти их полезными.

Пример программы Java для измерения времени выполнения в Java

Вот пример кода для измерения прошедшего времени между двумя кодовыми блоками с использованием System.nanoTime, M любых библиотек Java с открытым исходным кодом, таких как Apache commons lang, Google commons и Spring, также предоставляет служебный класс StopWatch, который можно использовать для измерения прошедшего времени в Java . StopWatch улучшает читабельность, сводя к минимуму ошибки вычислений при расчете истекшего времени выполнения, но имейте в виду, что StopWatch не является поточно- ориентированным и не должен использоваться совместно в многопоточной среде, а в его документации четко сказано, что это больше подходит для разработки и тестирования, а не для базовых измерений производительности. выполнение расчета времени в производственной среде.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *