2017-02-22 95 views
1

Вопрос: Какова стоимость выполнения обертывания объекта внутри другого объекта? Как в ОЗУ, так и при использовании ЦП увеличиваются от прямого вызова объекта.Код эффективности обертывания

Дополнительные детали: я работаю над созданием структуры, которая будет обертка код для выделения плагинов от реализации основной программы. Вопрос продолжает выскакивать в голове «Какова стоимость исполнения». Я знаю, что это будет больше, чем прямой доступ к обернутому коду. Однако я не могу найти какие-либо надежные источники или данные в Интернете, чтобы точно показать, какие результаты ожидать. Это проблема, поскольку я разрабатываю это, чтобы заменить реализацию примерно для 40 проектов. Поэтому, когда вас спрашивают, какой уровень накладных расходов ожидается в обновлении, мне нужно иметь некоторые данные.

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

public class WrapperObject implements WrapperInterface 
{ 
    private SomeObjectClass theObject; 

    public WrapperObject(SomeObjectClass theObject) 
    { 
     this.theObject = theObject; 
    } 

    public void method1() 
    { 
     theObject.method1(); 
    } 

    public void method2() 
    { 
     theObject.method2("someData", 1); 
    } 
} 

Также, я знаю о JIT в java и другой технике оптимизации JVM. Я спрашиваю, что я могу ожидать от накладных расходов, используя такую ​​систему для большого проекта. Поскольку я буду обертывать или конвертировать почти все, прежде чем он попадет в код плагина. Сюда входят методы, которые можно назвать несколькими 1000 раз в секунду, а также методы, которые вызываются только один раз.

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

+1

Измерить его, не делает предположение. Стоимость исполнения может быть 0, если JIT решает встроить или вызвать обернутый объект напрямую. – john16384

+0

Как я уже говорил, я знаю о JIT, и я не делаю предположений. Я планирую провести тестирование на прототипах. Я ищу некоторые знания, которые помогут объяснить, что я вижу.Таким образом, я не делаю предположений и не догадываюсь о том, что происходит. – DarkGuardsman

+0

Если стоимость выполнения упаковки объекта является проблемой, вы можете отказаться от объектно-ориентированного программирования. Это последняя вещь, о которой вы должны беспокоиться в Java. – jaco0646

ответ

1

Трудно оценить производительность/потребление ЦП, потому что это действительно зависит от того, что вы собираетесь делать с этими объектами и как вы собираетесь их обрабатывать. Но вы можете измерить потребление ОЗУ относительно хорошо.

Не вдаваясь в подробности, вы можете измерить размер объекта в сумме

  • размер заголовков (16 bytes для 64-битной версии JDK)
  • размер примитивных элементов (найти размеры в the documentation)
  • размер опорных элементов (8 bytes для 64-разрядной версии JDK)
  • размера смещения (несколько байт для выравнивания)

В вашем конкретном объекте будут заголовки, одна ссылка плюс смещение.

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

Для получения более подробной информации о размерах различных типов гляньте on this question

+0

Спасибо, что поможет довольно хорошо. Вы хотите хотя бы угадать часть процессора? – DarkGuardsman

+0

Очень сложно даже угадать, потому что есть факторы, которые влияют на производительность (от случая использования приложения до стратегий сборщика мусора). Единственное, что я могу предложить, это прочитать все о модели памяти Java и проанализировать ваши варианты использования. Вы можете начать с [этого] (https://dzone.com/articles/java-performance-tuning) –

+0

Спасибо, я прочитаю это здесь немного и посмотрю, поможет ли это :) – DarkGuardsman