2014-09-27 3 views
-2

Мне нужно написать программу, которая сравнивает время работы двух разных списков, одна из которых основана на массиве, а одна - связанный список. Я должен запускать его двадцать раз на двадцать разных длин, поэтому я сделал цикл for, чтобы сделать это для меня, он должен работать двадцать раз, но только распечатывал одну вещь, а затем сделал мой компьютер очень медленным, и это сказал, что процесс все еще работает на моей IDE. Вот код, спросите, нужно ли вам больше, но этого должно быть достаточно. Я хочу знать, почему цикл for печатает только одно, и после этого он говорит, что все еще работает.Что не так в этом цикле и что он печатает?

public class Foo4 { 
    public static void main(String[] args) { 
     int max = Integer.MAX_VALUE; 

     int diff = max/20; 
     int holder = 1; 
     long test1time; 
     long test2time; 
     StopWatch timer = new StopWatch(); 
     int t; 

     for (t = 0; t < 20; t++) { 
     AList test1 = new AList(); 
     Slist test2 = new Slist(); 

     for (int j = 0; j < holder; j++) { 
      test1.addFirst("the"); 
      test2.addFirst("thee"); 
     } 

     timer.reset(); 
     timer.start(); 
     test1.getLast(); 
     timer.stop(); 
     test1time = timer.getElapsedTime(); 
     timer.reset(); 
     timer.start(); 
     test2.getLast(); 
     timer.stop(); 
     test2time = timer.getElapsedTime(); 
     System.out.println(test1time + " : " + test2time); 
     holder += diff; 
     } 
    } 
} 
+2

Устранить форматирование. – MarsAtomic

+2

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

+0

Могу ли я получить что-то менее расплывчатое? Я бы форматировал его в любом случае, что облегчает его, но я не понимаю проблемы с форматированием? Как кто-то новый должен знать, как форматировать, чтобы сделать его проще для других? – trosy

ответ

3
 int max = Integer.MAX_VALUE; 

     int diff = max/20; 
     int holder = 1; 
... 
     for (t = 0; t < 20; t++) { 
      AList test1 = new AList(); 
      Slist test2 = new Slist(); 

      for (int j = 0; j < holder; j++) { 
       test1.addFirst("the"); 
       test2.addFirst("thee"); 
      } 
... 
      holder+=diff 
     } 

Вы понимаете, что в вашей второй итерации (при t == 1 добавления свыше 100 миллионов строк в списки? Это может занять некоторое время, не говоря уже о том, что ваша программа может зависнуть/потерпеть неудачу из в пределах памяти.

+0

Профессор сказал, что нам нужно было перейти от одного максимального размера с равномерно распределенными интервалами. – trosy

+1

Для простоты предположим, что максимальный размер для тестирования аналогичен 50. Если он работает, вы можете увеличить его дальше. Но пока просто проверить вашу логику/поток просто держите это значение. – Mr37037

+0

Хорошо, я сделал это, я установил его на 10000, и система выдает все нули для каждой части цикла, нет никакого способа, чтобы для запуска всех этих операций потребовалось нулевые миллисекунды? – trosy

0

Хорошо, я попытался запустить ваш код, и каждый раз получал тот же результат, что и 0: 0. Я не знаю, что вы используете какую IDE. Но я использовал eclipse, а затем отлаживал ваш код. установите точку останова на строке timer.reset(), а затем подождите несколько секунд, а затем перейдите к следующей строке, нажав F6, а затем переместитесь на следующий шаг, имея интервал От 2 до 3 секунд для каждого нажатия F6. Затем, наконец, напечатано какое-то значение, например: 2711: 3559.

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

 timer.reset();//set a breakpoint over here. When debugger comes on this line press F6 
    timer.start();//Wait for 3 seconds over here and then press F6. 
    test1.getLast();//Now at each below line wait for 3 seconds and then press F6 
    timer.stop(); 
    test1time = timer.getElapsedTime(); 
    timer.reset(); 
    timer.start(); 
    test2.getLast(); 
    timer.stop(); 
    test2time = timer.getElapsedTime(); 
    System.out.println(test1time + " : " + test2time); 
    holder += diff; 
Смежные вопросы