2014-12-28 6 views
1

Я пытаюсь внести незначительные изменения, чтобы улучшить производительность в моей программе. В частности, при константах. У меня есть константы для: WIDTH = x, HEIGHT = y и AREA = x * y.Назначить результат операции константе

Теперь, как работает java при использовании постоянной AREA?

Рассчитывает ли он каждый раз результат x * y и использует его там, где это необходимо? Или он вычисляет x * y один раз, в начале и сохраняет результат под «переменной» AREA?

Иными словами, предположим, что WIDTH = 10, HEIGHT = 20; лучше ли самому делать расчет и назначить AREA = 200? Или просто напишите AREA = WIDTH * HEIGHT? Также предположим, что вам понадобится эта константа много раз в программе.

В моем случае я не думаю, что это имеет большое значение с точки зрения производительности/эффективности, но я предполагаю, что в больших программах это будет.

Спасибо!

EDIT: Чтобы было понятно, что я имею в виду с "постоянными":

например

final static int WIDTH = 10, 
    HEIGHT = 20, 
    AREA = HEIGHT*WIDTH; 
+1

Константные значения вычисляются один раз, во время компиляции, а не каждый раз, когда используется константа. – Jesper

+0

Предположительно, когда вы говорите «константы», вы имеете в виду статические конечные поля? –

+0

@Jesper - это true, если константы являются истинными константами времени компиляции. Но на данный момент у нас нет кода OP, и поэтому мы не можем быть уверены. –

ответ

3

Предполагая, что вы имеете в виду это:

public class Test { 
    final static int WIDTH = 10, HEIGHT = 20, AREA = HEIGHT * WIDTH; 
} 

тогда все три из этих констант константы времени компиляции. С другой стороны, в

public class Test { 
    static int WIDTH = 10, HEIGHT = 20, AREA = HEIGHT * WIDTH; 
} 

переменные не являются постоянными, но выражения по-прежнему оценивается только один раз ... при инициализации Test класса.

Единственные случаи, когда выражения будут выполняться несколько раз в случае, как это:

public class Test { 
    final int WIDTH = 10, HEIGHT = 20, AREA = HEIGHT * WIDTH; // non-static field 
} 

или это:

public class Test { 
    public void method() { 
     final int WIDTH = 10, HEIGHT = 20, AREA = HEIGHT * WIDTH; // local variable 
    } 
} 

Но во всех случаях выражение будет вычисляться только во время выполнения один раз (если вообще) каждый раз, когда декларация оценивается. Он не оценивается, когда (например) вы используете константу или переменную.


Вы сказали:

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

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

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


Совет: пытается оптимизировать код на этом уровне, как правило, это пустая трата времени ... если 1) вы не измерили производительность приложений и определили, что это действительно вопрос и 2) вы профилированные приложение и определило, что раздел кода, который вы рассматриваете, является действительно узким местом производительности.

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