Cesitar Ps Ответов: 1

Измерьте время выполнения факторного метода. Correct верен ли этот алгоритм?


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

Заранее спасибо

Что я уже пробовал:

/* ================================ Ява ================================== */


public static BigInteger Factorial(int n)
   {
       BigInteger bi = BigInteger.ONE; // Estructura que almacena un numero infinitamente grande y asi se evita el desbordamiento por almacemiento
       for (int i = n; i > 0; i--)
       {
           bi = bi.multiply(BigInteger.valueOf(i));
       }
       return bi;
   }
   public static void main(String[] args)
   {
       // Pedimos la cantidad de veces que queremos correr el ejercicio
       System.out.print("Calculo Factorial --> Ingrese el numero de repeticiones \t");
       Integer NroVeces = Integer.parseInt(new Scanner(System.in).nextLine());
       // Pedimos el numero del cual deseamos calcular el factorial
       System.out.print("Calculo Factorial --> Ingrese el numero \t");
       Integer Nro = Integer.parseInt(new Scanner(System.in).nextLine());

       System.out.println("=================================================");
       for (int i = 0; i < NroVeces; i++)
       {
           // Empezamos a medir el tiempo que llevara la ejecucion de la aplicacion
           long HInicio = System.nanoTime(); // System.currentTimeMillis();
           BigInteger Resultado = Factorial(Nro);  // Invocamos a la funcion que calcula el factorial de un numero cualquiera
           long HFin = System.nanoTime(); // Detenemos la medicion del tiempo que llevo la ejecucion de la aplicacion
           System.out.println(String.format("%d!: %s",Nro, Resultado));  // Mostramos la respuesta

           // ¿¿¿¿ is correct ????
           long Elapsed = HFin - HInicio;
           String ElapsedTime = String.format("%02dh: %02dmin: %02ds: %fms",
                   TimeUnit.NANOSECONDS.toHours(Elapsed),
                   TimeUnit.NANOSECONDS.toMinutes(Elapsed),
                   TimeUnit.NANOSECONDS.toSeconds(Elapsed),
                   TimeUnit.NANOSECONDS.toMillis(Elapsed)%1000.0
           );
           System.out.println("T.Transcurrido: "+ ElapsedTime);
           System.out.println("=================================================\n");
       }

       System.out.print("Presione cualquier tecla para terminar . . . ");
       Scanner input= new Scanner(System.in);
       input.nextLine();
   }

1 Ответов

Рейтинг:
0

OriginalGriff

Проблема в том, что Windows-это многозадачная среда, и в фоновом режиме обычно происходит довольно много событий, которые могут повлиять на ваши результаты. А еще прибавили к этому скорость современных процессоров и то .NET JIT compiler, становится трудно получить "хороший" результат от одного выполнения. Чтобы получить "надежные" числа, вам нужно рассчитать время выполнения функции на большое количество итераций и, вероятно, выполнить тест несколько раз.
Обычно я выполняю около 100 000 итераций, но иногда достаточно и меньшего числа. Взгляните на это: Подсчет строк в строке[^]- все дело в таймингах и может дать вам ключ или два.