Оптимизация скорости: частные и публичные переменные - Java - PullRequest
4 голосов
/ 09 сентября 2011

Я задаю этот вопрос исключительно для скоростных аспектов вопроса.

В чем разница в скорости получения значения от объекта, когда он является частным или общедоступным (Java)?

class MyClass {
    public int myInt = 5;
}
class MyOtherClass {
    private int myInt = 5;

    public int getMyInt() {
        return myInt;
    }
}
class MyMainClass {
    public static void main (String [] args) {
        MyClass myObject = new MyClass();
        MyOtherClass myOtherObject = new MyOtherClass();

        // which is faster?
        System.out.println(myObject.myInt);
        System.out.println(myOtherObject.getMyInt ());
    }
}

Я знаю, что могу это проверить, но если кто-нибудь уже это знает, это не повредит :) Заранее спасибо!

Ответы [ 5 ]

8 голосов
/ 09 сентября 2011

Открытый и частный доступ - это не что иное, как определение во время компиляции, есть ли у вас доступ к переменной. Во время выполнения они точно такие же. Это означает, что если вы можете обмануть JVM, думая, что у вас есть доступ (посредством отражения, небезопасного или изменения байт-кода), тогда вы можете это сделать. Публичное и частное - это просто информация о времени компиляции. Это не значит, что он не хранится в байт-коде, потому что это так, но только так, что на него можно ссылаться, если что-то пытается скомпилировать его.

7 голосов
/ 09 сентября 2011

Модификатор доступа в поле не имеет значения для скорости, но вызывает метод доступа .

Однако разница неотлично, и, вероятно, уменьшится после повторного вызова из-за оптимизации компилятора JIT.Это зависит от вашей ситуации, но я не нашел случая, когда проблемы производительности оправдывали бы устранение доступа.Пусть правильные принципы проектирования будут определять ваши решения.

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

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

1 голос
/ 09 сентября 2011

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

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

Это зависит от конкретного компилятора, генерировать ли встроенный код или вызов функции. Из-за отсутствия знаний о том, какой компилятор Java вы используете (и, возможно, какие параметры компилятора), невозможно сказать наверняка.

1 голос
/ 09 сентября 2011

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

0 голосов
/ 09 сентября 2011

С точки зрения производительности, разница бесконечно мала, если есть вообще разница.Компилятор собирается оптимизировать этот код почти одинаково, и как только код будет скомпилирован, JVM будет обрабатывать публичные и приватные переменные одинаково (я не верю, что он даже знает о различии между публичными и приватными переменными).компиляция).

С прагматической точки зрения сложно представить какой-либо возможный сценарий, в котором стоило бы нарушить традиционный шаблон доступа к атрибутам Java для повышения производительности.Был подобный вопрос, заданный в StackOverflow по этому вопросу для C ++, и ответы столь же актуальны для Java:

Есть ли какие-либо соображения производительности, чтобы сделать атрибуты защищенными / закрытыми?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...