Измерять время выполнения алгоритма в Android

Я нуждаюсь в том, чтобы измерить время, в котором работает алгоритм в Android. Например: я хочу сравнить скорость, в которой получается Factorial числа, сделанного возвратом и фактом без этого.

Это моя программа:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button btnCalcular;
    EditText input;
    TextView txtResultado, txtTiempo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        input = (EditText)findViewById(R.id.inputNumero);
        btnCalcular = (Button)findViewById(R.id.btnCalcular);
        txtResultado = (TextView)findViewById(R.id.txtResultado);
        txtTiempo = (TextView)findViewById(R.id.txtTiempo);

        btnCalcular.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        int number = Integer.parseInt(input.getText().toString());
        int fact = factorial(number);
        txtResultado.setText("El factorial de " +number+ " es: " +fact);
    }

    public static int factorial(int number) {
        if (number <= 1)
            return 1;
        return number * factorial(number - 1);
    }
}

Я жду Ваши ответы.

4
задан 15.06.2016, 01:13
3 ответа

Чтобы измерять прошедшее время, если он состоит в том, что ты не требуешь "микрофон benchmarking", определять после того, как инициализировать твой процесс:

long tInicio = System.currentTimeMillis();

, закончив твой процесс:

long tFinal = System.currentTimeMillis();
long tDiferencia = tFinal - tInicio;

ты Можешь конвертировать различие в секунды:

double segundosTranscurridos = tDiferencia/1000.0;

Следовательно в тебе cГіdigo serГ - в:

  @Override
    public void onClick(View v) {
        long tInicio = System.currentTimeMillis();
        int number = Integer.parseInt(input.getText().toString());
        int fact = factorial(number);
        txtResultado.setText("El factorial de " +number+ " es: " +fact);
        long tFinal = System.currentTimeMillis();
        long tDiferencia = tFinal - tInicio;
        //double segundosTranscurridos = tDiferencia/1000.0;
        txtTiempo.setText("tiempo transcurrido : "  + String.valueOf(tDiferencia) +  " millisegundos.");
    }
3
ответ дан 24.11.2019, 14:09
  • 1
    @LuiggiMendoza, Что редкий, что это зло, это - то, что осуществляется в приложениях Android, чтобы измерять время процессов!. – Jorgesys♦ 15.06.2016, 01:23
  • 2
    Возможно реализовывать profiling, чтобы получать данные " super" exact, но я думаю, что OP я не верю, потребуйте реализации benchmark на этом уровне, и #250; nicamente измерять прошедшее время. – Jorgesys♦ 15.06.2016, 01:26
  • 3
    " Profiling with Traceview" Мы увидим, что говорит пользователь, который является м и # 225; s важно. =) – Jorgesys♦ 15.06.2016, 01:31
  • 4
    Это одна l и # 225; stima, что ты не сумел допускать, что есть что-то новое, что ты мог бы изучать, и что ты показываешь, он не правилен, включая, когда informaci и # 243; n она точная и прямая и est и # 225; впереди твой. В конце концов... –  15.06.2016, 01:42
  • 5
    Спасибо за informaci и # 243; n в оба. Я изучаю понемногу, но пока то, в чем он нуждался, было чем-то b и # 225; sico, как которое он предложил @Elenasys... Только, который вместо того, чтобы использовать System.currentTimeMillis, () использовал System.nanoTime () для того, чтобы был очевиден м и # 225; s различие variaci и # 243; n. Я сравниваю времена различных перекурсивных алгоритмов как в Java (Android), так и в Свифте (iOS)... Если у кого-то есть идея, как заставление это в Свифте быть и # 237; в благодарный! – Juan Sánchez 15.06.2016, 02:18

То, что ты просишь, называются Микрофон Benchmark. Существуют книжные магазины в Java, чтобы выполнять микрофон benchmarks и сравнивать результаты времени выполнения кодов.


Заметь перед тем, как продолжать: Если кто-то говорит тебе наивно, используй System#currentTimeMillis раньше и после твоего кода, этот человек не знает, что абсолютно ничто из как не функционирует JVM. В других языках вне JVM эта техника может функционировать, но не с JVM. Случается, что JVM делает несколько оптимизации, когда работают некие фрагменты кода после нескольких повторений, чем, если ты продолжаешь эту "рекомендацию", ты считал бы что-то этим (это идея):

medirTiempo(metodo1); 5.4s
medirTiempo(metodo2); 2.1s

И вложив выполнение

medirTiempo(metodo2); 5.7s
medirTiempo(metodo1); 1.8s

И ты не знал бы, подходящие ли результаты.

Но помести это в loop

Хуже еще. JVM выполняет оптимизацию, когда код работает несколько раз, гораздо больше, когда имеются те же результаты. А именно, этот код:

for
    medirTiempo(metodo1)
end for 20.1s
for
    medirTiempo(metodo2)
end for 8.1s

Вложив Ваше выполнение

for
    medirTiempo(metodo2)
end for 30.4s
for
    medirTiempo(metodo1)
end for 13.6s

Тогда, остается большое сомнение: у какого осуществления есть лучший результат?


Для Java, ты можешь писать микрофон benchmarks используя JMH и Caliper. Так как твой микрофон benchmark ориентировался, чтобы тестировать приложения Android, я рекомендую тебе использовать Caliper, потому что он построен командой Google и - framework, который они используют, чтобы писать Ваш benchmarks, как они показывают в официальной документации:

Always Measure

Before you start optimizing, make sure you have в problem that you need to solve. Make sure you хан accurately measure your existing выступление, or you won't be able to measure the benefit of the alternatives you try.

Every claim made in this document is backed up by в benchmark. The source to these benchmarks хан be found in the code.google.com "dalvik" project.

The benchmarks пахал built with the Caliper microbenchmarking framework for Java. Microbenchmarks пахал hard to get right, so Caliper goes out of its way to do the hard work for you, and even detect some вступи в брак where yoгre not measuring what you think yoгre measuring (because, say, the VM ты существуешь managed to optimize all your code away). We highly recommend you использовал Caliper to run your own microbenchmarks.

Переведенный (эмфаза моя):

Всегда Измерять

Прежде чем ты начнешь оптимизацию, убедись имения проблемы, которую ты нуждаешься в том, чтобы решить. Убедись, что ты измеряешь твой существующий результат точным образом, или тебе не дадут возможность, чтобы измерять благодеяние альтернатив, которые ты тестируешь.

Каждый элемент, сделанный в этом документе поддержан benchmark. Шрифты этих benchmarks могут быть найденными в проекте "dalvik" в code.google.com.

benchmarks написаны рамой работы для microbenchmarks Caliper. microbenchmarks трудные для того, чтобы реализовать правильным способом, так что Caliper помогает тебе делать тяжелую работу, и включая обнаруживать какие-то случаи, где ты не измеряешь, что ты думаешь, что ты измеряешь (потому что, мы сказали, машина virtuale смогла оптимизировать tódo возможный код). Мы [Google] рекомендуем высоко использовать Caliper, чтобы выполнять твои собственные microbenchmarks.


И я не могу использовать JMH, чтобы писать microbenchmarks в Java?

Ясно, что ты можешь. Но JMH - проект OpenJDK и более ориентировался на OpenJDK и HotSpot, проекты, поддержанные сообществом Java и Oracle соответственно. Устройства Android используют Dalvik, осуществление JVM Google, поэтому результаты, которые бросают JMH, возможно, что они не являются самыми подходящими для Dalvik.

3
ответ дан 24.11.2019, 14:09

cГіdigo, что напечатает тебя в continuaciГіn, развито в java это возможно приспосабливать, так как android он работает с java, сигару обладает примером в continuaciГіn приложение cГіdigo Гєnico вычисления времени: introducir la descripción de la imagen aquí

introducir la descripción de la imagen aquí

introducir la descripción de la imagen aquí

introducir la descripción de la imagen aquí

0
ответ дан 24.11.2019, 14:09
  • 1
    Очень хороший aportaci и # 243; n, но я рекомендую тебе добавлять c и # 243; я говорю и не изображения, привет! =) – Jorgesys♦ 20.09.2016, 18:47