2012-05-18 3 views
3

Ниже приведены два фрагмента. Обратите внимание, что ОДНА И ТОЛЬКО разница между программами заключается в том, что один break to return, а другой return сразу. Я понимаю, что хорошая практика проектирования имеет одну точку выхода внутри метода. Но я не беспокоюсь о дизайне здесь. Если я заплачу дополнительно за использование break, сколько дополнительных вычислений/памяти/тактового цикла я заплачу?нарушение или возврат изнутри цикла for

Программа один:

public boolean doThis(String[] A){ 
    boolean indicator = false; 
    for(int i=0; i<A.length; i++){ 
     if(A[i].equals("Taboo")) 
     break; 
     for(int x=0; x<=i; x++) 
      //some work is done here. to make indicator true or false 
    } 
    return indicator; 
} 

Программа два:

public boolean doThis(String[] A){ 
    boolean indicator = false; 
    for(int i=0; i<A.length; i++){ 
     if(A[i].equals("Taboo")) 
     return false; 
     for(int x=0; x<=i; x++) 
      //some work is done here. to make indicator true or false 
    } 
    return indicator; 
} 

ответ

4

Если ваш компилятор ничего хорошего, вы платите чуть-чуть меньше за "возвращение ложных" дела.

Возможно, вы думаете, что «перерыв» стоит дорого. С crummy компилятором, это одна команда перехода, которая приземляется на возвращение. Хороший компилятор поймет, что прыжок суперплодный и может поднять оператор возврата до точки разрыва, если вы не возражаете против расширения кода.

Что делает «возврат ложного» случая немного дешевле, так это то, что «индикатор возврата» может потребовать выборки из памяти, чтобы поместить результат в регистр возврата результата вызова, который обычно используется компиляторами. «return false» загружает константу в регистр (в частности, регистр возврата результата); это всегда быстрее, чем выборка из памяти на современных машинах, потому что литерал встроен в поток команд, который процессор уже выбрал.

Усовершенствованный компилятор может хранить все переменные в регистрах. В этом случае «индикатор возврата» может на самом деле быть быстрее, потому что интеллектуальный компилятор может запрограммировать на размещение «индикатора» в регистре возврата результата; никакая работа, требуемая для загрузки значения. Для программы, которую вы закодировали с вызовом на строку равным, я сомневаюсь, что компилятор попытается сохранить все переменные в регистрах; это просто должно было дорого пролить их всех на призыв к равному.

Все эти мелкие детали в стороне, это не та вещь, о которой вы должны беспокоиться об оптимизации.

+0

Я не пытаюсь оптимизировать. Я пытаюсь углубить свое понимание. +1 для вашего объяснения. – kasavbere

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