2015-10-21 3 views
0

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

код из класса

private void checkSize(int index){ 
     if (index >= myArray.length){ 
      throw new ArrayIndexOutOfBoundsException(); 
     } 
    } 

    public void set(int index, T obj){ 

     if (index >= myArray.length){ 
      reinitalizeArray(index+1); 
     } 
     myArray[index] = obj; 
    } 

Почему бы переписать, если заявление в наборе, когда вы могли бы сделать попробовать поймать, вызвав checkSize() как так?

private void checkSize(int index){ 
     if (index >= myArray.length){ 
      throw new ArrayIndexOutOfBoundsException(); 
     } 
    } 

    public void set(int index, T obj){ 

     try{ 
      this.checkSize(index); 
      myArray[index] = obj; 
     }catch (ArrayIndexOutOfBoundsException exception){ 
      reinitalizeArray(index+1); 
     } 
    } 
+3

Предоставление фрагмента кода может быть проще «судить» вашу ситуацию. – User404

+0

Обычно это не имеет никакого значения, поскольку компилятор сам выполняет такую ​​оптимизацию ... –

+0

Решение о дублировании кода должно (почти) никогда не основываться на производительности - он должен основываться на том, будут ли два бита кода всегда делать то же самое и делиться одними и теми же знаниями в будущем или нет.Если ответ «да», то не дублируйте, если ответ «нет», вы должны, вероятно, дублировать. – assylias

ответ

0

В вашем варианте «повторного использования» используются исключения для управления потоком.

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

Его также ужасно с точки зрения производительности, потому что, если возникает исключение, объект Exception создается и инициализируется, нормальный поток программы приостанавливается, и виртуальная машина начинает поиск соответствующего блока catch, а затем возобновляет извещение оттуда. Это также создает дополнительную нагрузку на сбор мусора, поскольку исключение должно быть позже собрано в мусор.

Вызов checkSize() в вашем предложении также полностью застенчив, так как назначение myArray[index] = obj; вызовет то же самое исключение, если массив был слишком мал.

0

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

Производительность может отличаться в зависимости от реализации списка. Если это ArrayList, это не должно сильно меняться. Если это другая реализация, это может иметь огромное значение. Допустим, вы использовали LinkedList. Каждый вызов get (index) будет перебираться по всему списку до тех пор, пока элемент индекса не будет достигнут, пока тот же вызов в массиве или ArrayList будет напрямую ссылаться на элемент и возвращать его. Или предположим, что вы используете вектор как реализацию. В этом случае синхронизация происходит сверху.

Кроме того, код будет по крайней мере, быть разными в «Начале» элементы: массив [индекс] или list.get (индекс)

0

код Java, то же самое, но сгенерированный код будет отличаться. Когда вы используете реальный тип (например, List или Vector), скомпилированный код будет содержать прямую ссылку на метод доступа ([]), но когда вы используете точно такой же код с общим типом (перечисление), скомпилированный код будет содержать косвенные ссылки так как сначала должен получить реальный тип, а затем получить надлежащий метод доступа. Я лично считаю, что в большинстве случаев производительность, полученная таким образом, не стоит того. Держите его коротким и простым.

Смежные вопросы