Не уверен, как использовать System.nanoTime () для моей программы - PullRequest
0 голосов
/ 05 февраля 2019

Мне нужно измерить время в наносекундах для моего проекта, но я не уверен, как правильно внедрить его в мою программу.Я знаю, что мне нужно использовать что-то вроде:

long startTime = System.nanoTime();

...

long endTime = System.nanoTime();

long timeElapsed = endTime - startTime;

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

import java.util.*;
public class fiboSeriesRec
{

public static void main(String[] args)
{

    //Scanner allows input from user, int in this case
    Scanner sc = new Scanner(System.in);
    long n;          //declare n as a long since numbers get too large for int
    System.out.println("How many numbers 'n' do you wish to see?"); //Prompts the user to input a number
    n = sc.nextInt();

    System.out.println("The first " + n + " Fibonacci numbers are:");
    for (long i=0; i < n; i++)              //Adds each 'n' to a list as the output
    {
        System.out.println(fibonacci(i));   //Prints out the list
    }
}
//Recursive function for fibonacci sequence
public static long fibonacci(long num) {

    if (num == 0) {
        return 0;
    }
    else if(num == 1)
    {
        return 1;
    }

    return fibonacci(num-1) + fibonacci(num-2);
}

}

1 Ответ

0 голосов
/ 05 февраля 2019

Я предполагаю, что вы определяете, сколько времени занимает ваш код?

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

Это означает, что вы можете сделать:

import java.util.*;
public class fiboSeriesRec {

    public static void main(String[] args) {
        //Scanner allows input from user, int in this case
        Scanner sc = new Scanner(System.in);
        long n;          //declare n as a long since numbers get too large for int
        System.out.println("How many numbers 'n' do you wish to see?"); //Prompts the user to input a number
        n = sc.nextInt();

        System.out.println("The first " + n + " Fibonacci numbers are:");

        long startTime = System.nanoTime();
        for (long i=0; i < n; i++) {              //Adds each 'n' to a list as the output
            System.out.println(fibonacci(i));   //Prints out the list
        }
        long endTime = System.nanoTime();

        System.out.println("It took " + n + " iterations: " + (endTime - startTime) + " nanoseconds");
    }

    //Recursive function for fibonacci sequence
    public static long fibonacci(long num) {

        if (num == 0) {
            return 0;
        }
        else if(num == 1)
        {
            return 1;
        }

        return fibonacci(num-1) + fibonacci(num-2);
    }
}

Обратите внимание, что этот код синхронизирует время печати, чтовероятно, довольно медленная операция и не хорошее измерение того, сколько времени занимает функция.Если вы хотите рассчитать время, вам нужно только рассчитать время функции, а затем добавить разницу к сумме, а затем сообщить сумму в конце.

В псевдокоде это означает:

long sum = 0;
for (int i = 0 ...) {
    long start = recordTime();
    Object result = doCalculation();
    sum += recordTime() - start;
    // Do something with result here, like print it so you don't time  printing
}
// `sum` now contains your time without interference of the loop or printing
...