Секундомер не сообщает точное время
Почему мой код сообщает, что этот процесс занимает до 5 секунд, хотя в реальном времени он даже не занимает четверть секунды?
Я попытаюсь выделить код, связанный с секундомером, чтобы вам не пришлось просматривать все это. Будьте добры, так как это мой первый пост, так что извините, если он неуклюжий. Похоже, что если код не выделен жирным шрифтом, будет ** вокруг рассматриваемых частей.
* фон: это для математического эссе. Предполагается, что это программа, которая находит основные факторы и указывает время, необходимое для их поиска. Он работает в поиске основных факторов, но секундомер сообщает о смешном количестве в секундах. Кроме того, на этот код больше всего влияют
http://www.geeksforgeeks.org/print-all-prime-factors-of-a-given-number/
с секундомером, пользовательской функцией ввода и повторением, которые добавляются либо моей собственной мыслью, либо с помощью других *
// Program to print all prime factors
import java.io.*;
import java.lang.Math;
import java.util.Scanner;
import java.text.DecimalFormat;
class primeFactorer4
{
**static long startTime = System.nanoTime();**
// A function to print all prime factors
// of a given number n
public static void primeFactors(long n)
{
// Print the number of 2s that divide n
while (n%2==0)
{
System.out.print(2 + " ");
n /= 2;
}
// n must be odd at this point. So we can
// skip one element (Note i = i +2)
for (int i = 3; i <= Math.sqrt(n); i+= 2)
{
// While i divides n, print i and divide n
while (n%i == 0)
{
System.out.print(i + " ");
n /= i;
}
}
// This condition is to handle the case whien
// n is a prime number greater than 2
if (n > 2)
System.out.print(n);
}
public static void main (String[] args)
{
Console console = System.console();
String input = console.readLine("Enter input:");
long n = Long.valueOf(input);
for (int k=1; k<=10; k++)
{
primeFactors(n);
System.out.println(" Try " + k);
}
**double endTime = System.nanoTime();
double totalTime = endTime - startTime;
DecimalFormat totalTimeFormat = new DecimalFormat("##.###");
System.out.println(" Time taken in seconds:" + totalTimeFormat.format(totalTime/10/1000000000));**
primeFactorer4.main(args);
//reason for the weird division is for clarity. "totalTime" is the time surpassed
//to repeat all the methods, the "10" in the middle is to get the mean total time
//of all the primeFactors cycles, and the "1000000000" at the end is to convert nanoseconds into seconds
}
}
Причина, по которой я сделал 10 звонков на PrimeFactors, заключается в том, что я хотел, чтобы мой компьютер делал для меня среднее значение результатов, так как любая школа скажет вам, что при экспериментах вам необходимо повторить ваш IV уровень 3(или более) раза, чтобы получить более точные результаты
2 ответа
Ладно, я решил свою проблему. Я поместил команду println в переменные startTime и endTime и обнаружил, что переменная startTime запускалась при запуске программы, а НЕ когда пользователь вводит число, которое он хочет вычислить. Теперь он дает мне подходящие результаты, которые, как мне кажется, не связаны с моей личной скоростью ввода чисел.
Для тех, кто интересуется программой, решение этой проблемы относится к вам, или вы просто заинтересованы в том, чтобы увидеть контраст между решением и проблемой, вот новый код.
// Program to print all prime factors
import java.io.*;
import java.lang.Math;
import java.util.Scanner;
import java.text.DecimalFormat;
class primeFactorer4
{
// A function to print all prime factors
// of a given number n
public static void primeFactors(long n)
{
// Print the number of 2s that divide n
while (n%2==0)
{
System.out.print(2 + " ");
n /= 2;
}
// n must be odd at this point. So we can
// skip one element (Note i = i +2)
for (int i = 3; i <= Math.sqrt(n); i+= 2)
{
// While i divides n, print i and divide n
while (n%i == 0)
{
System.out.print(i + " ");
n /= i;
}
}
// This condition is to handle the case whien
// n is a prime number greater than 2
if (n > 2)
System.out.print(n);
}
public static void main (String[] args)
{
Console console = System.console();
String input = console.readLine("Enter input:");
long n = Long.valueOf(input);
long startTime = System.nanoTime();
System.out.println(startTime);
for (int k=1; k<=10; k++)
{
primeFactors(n);
System.out.println(" Try " + k);
}
double endTime = System.nanoTime();
System.out.println(endTime);
double totalTime = endTime - startTime;
DecimalFormat totalTimeFormat = new DecimalFormat("##.##########");
System.out.println(" Time taken in seconds:" + totalTimeFormat.format(totalTime/10/1000000000));
primeFactorer4.main(args);
//reason for the weird division is for clarity. "totalTime" is the time surpassed
//to repeat all the methods, the "10" in the middle is to get the mean total time
//of all the primeFactors cycles, and the "1e9" at the end is to convert nanoseconds into seconds
}
}
Я написал кое-что для вас, я думаю, что это может быть быстрее и, следовательно, более точным, но имейте в виду, что для выполнения ЛЮБОГО утверждения требуется время, поэтому оно не может быть ТОЧНО точным.
long start= System.currentTimeMillis(); //start time
//Insert code here
long difference = System.currentTimeMillis(); //finish time
difference -= start;
System.out.println("Time took to run code was " + difference);; //Print the amount of time that it took