Увеличивает ли набор текста интерфейс? - PullRequest
1 голос
/ 12 октября 2009

Если у меня есть объект с 50 получателями / установщиками, где каждые 10 из них определены в новом интерфейсе, и я ввожу объект в качестве одного из этих интерфейсов, увеличит ли он производительность?

Не уверен, как работает поиск методов / переменных, но кажется, что если вы введете объект с чем-то, у которого меньше методов, будет быстрее запускать эти методы?

Я спрашиваю ActionScript / Java, но это относится к любому языку, который я предполагаю.

Итак, если у меня был объект DisplayObject, который реализовал 5 интерфейсов (IResizable, IScalable, IMovable, IMeasurable, IDrawable), и я набрал его как IResizable для доступа к аксессорам x и y, это оптимизация?

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

Ответы [ 5 ]

4 голосов
/ 12 октября 2009

Если код выполняется изначально (скомпилированный / скомпилированный), методы интерфейса равны виртуальным вызовам. Класс будет иметь v-таблицу, в которой перечислены адреса функций для каждого метода интерфейса. Это добавляет немного косвенности, но, как правило, очень быстро. Это так же, как работают виртуальные методы. Обычно они будут одинаковыми или очень близкими по скорости исполнения.

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

Не существует «поиска метода» (это выясняется во время компиляции), поэтому число методов не имеет значения.

Конечно, это обобщенный ответ и совсем не относится к интерпретируемому коду.

3 голосов
/ 12 октября 2009

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

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

1 голос
/ 12 октября 2009

это оптимизация?

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

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

Основная причина для интерфейсов - это IMO следующим образом: если, например, я реализую класс DeviceManager следующим образом ...

interface IDevice
{
  string name { get; }
  string description { get; }
  bool start();
  bool stop();
}

class DeviceManager
{
  void install(IDevice device) { ... }
  void displayUI(Windows window) { ... }
}

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

0 голосов
/ 12 октября 2009

Напишите тестовую программу в вашей среде, которая использует оба этих метода. Пусть каждый метод вызывается 1000000 раз и измеряется быстрее.

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

0 голосов
/ 12 октября 2009

Для Java, поскольку вызов метода объекта определяется во время выполнения, это действительно не имеет значения. Интерфейс предназначен не только для чтения, он используется для проверки иерархии объектов и полиморфизма.

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