2015-02-13 1 views
0

У меня есть два вопроса, которые были поворот вокруг в моей голове в течение некоторого времени, и я надеюсь, что некоторый знающий человек может ответить на них для меня :)JAVA: Статические методы влияют на производительность во время исполнения?

  1. ли использовать статические методы хорошо/плохо для выполнения во время выполнения коды (время)?
  2. Как насчет памяти? Используют ли они больше памяти, чем их аналоги экземпляров?
+0

это действительно так. Я искал, но кажется, что не очень хорошо :) .. однако мой второй вопрос все еще стоит. Имеет ли это влияние на потребление памяти? – tupini07

+0

Объем памяти, которую принимает метод, такой же, как и статический метод или метод экземпляра. Как только метод вызывается, он создаст новый стек стека, скопирует все аргументы в этот фрейм и выполнит то, о чем вы его попросите. Таким образом, память не имеет никакого разницы, даже если есть, было бы незначительно – Arkantos

+0

Как сказал Майк, одно отличие, которое я вижу, - это неявная переменная 'this' в качестве первого аргумента для всех методов экземпляра, которая неприменима для статических методов. – Arkantos

ответ

7

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

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

Значительное влияние на производительность? Это не шанс.

+1

Спасибо, что разобрался со мной :) – tupini07

+0

Хорошо, я задал этот вопрос несколько более точным ответом здесь: http://stackoverflow.com/a/28511095/773113 –

0
  1. Да и нет.

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

Эти накладные расходы станут незначительными для более интенсивных методов ЦП. Также VM может оптимизировать нестатический вызов ...

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

  1. В стеке нет ссылки на объект (это), поэтому есть еще одна экономия. Я думаю, что это довольно незначительно.