Как я могу удалить дубликаты из моего кода в Java? - PullRequest
0 голосов
/ 30 октября 2018

Я написал тест, который запустит рекурсию Фибоначчи для 40 и запустит рекурсию запоминания Фибоначчи для 40 и сравнит время, чтобы быть как минимум на порядок меньше. Это то, что я так далеко:

      @Test
  void MemoizedMagnitudeDifferentFromRecursion(){
    Fibonacci simpleRecursiveFibonacci = new SimpleRecursiveFibonacci();
    Fibonacci memoizedRecursiveFibonacci = new MemoizedRecursiveFibonacci();
    int n = 40;

    long recursionStartTime = System.nanoTime();
    simpleRecursiveFibonacci.fibonacci(n);
    long recursionTime = System.nanoTime() - recursionStartTime;

//The code below does the same as the code above, how can I remove duplicated code?
    long memoizedStartTime = System.nanoTime();
    memoizedRecursiveFibonacci.fibonacci(n);
    long memoizedTime = System.nanoTime() - memoizedStartTime;

    assertTrue(recursionTime/memoizedTime > 1);
  }

1 Ответ

0 голосов
/ 30 октября 2018

Извлеките логику из функции и передайте логику для запуска как Runnable. Пусть функция запускает переданный фрагмент логики и возвращает время, затраченное на ее выполнение.

private long execute(Runnable runnable) {
    long startTime = System.nanoTime();
    runnable.run();
    return System.nanoTime() - startTime;
}

Назовите это как

long recursionTime = execute(() -> simpleRecursiveFibonacci.fibonacci(n));
long memoizedTime = execute(() -> memoizedRecursiveFibonacci.fibonacci(n));
assertTrue(recursionTime/memoizedTime > 1);

Еще одна опция (как предложено SystemGlitch @) - передать экземпляр Fibonacci и int и вызвать fibonacci внутри метода.

private long execute(Fibonacci fibonacciInstance, int n) {        
    long startTime = System.nanoTime();
    fibonacciInstance.fibonacci(n);
    return System.nanoTime() - startTime;
}

Назовите это как

long recursionTime = execute(simpleRecursiveFibonacci, n);
long memoizedTime = execute(memoizedRecursiveFibonacci, n);
assertTrue(recursionTime/memoizedTime > 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...