Будет ли компилятор Java оптимизировать отливки для ручного разрешения перегрузки? - PullRequest
1 голос
/ 04 января 2012

Учитывая следующий код:

class C {
   static void m(String s) { ... } // 1
   static void m(Object o) { ... } // 2

   public static void main(String[] args) {
      m( (Object) "test"); // call m version 2
   }
}

Будет ли компилятор Java оптимизировать преобразование в Object i main, чтобы такое «разрешение перегрузки вручную» не повлияло на производительность?Или фактическое выполнение во время выполнения все еще выполняет приведение?

Ответы [ 2 ]

4 голосов
/ 04 января 2012

Этот вызов выбирается в время компиляции . Так что это не столько оптимизация, сколько сам компилятор, выбирающий, какой метод вызывать. Приведение предназначено для помощи компилятору и не повлияет на производительность во время выполнения.

Это отличается от переопределения, при котором вызываемый объект диктует метод во время выполнения, например,

shape.getArea(); // determined by whether shape is a square, circle etc.

Если вы напишите выше с / без приведения и сгенерируете байт-код (javap -verbose -c C), вы увидите эту разницу в сгенерированном коде:

<    2: invokestatic    #7; //Method m:(Ljava/lang/Object;)V
---
>    2: invokestatic    #7; //Method m:(Ljava/lang/String;)V

т.е. компилятор просто выбрал другой метод (const #7 будет меняться в каждом случае, чтобы отразить этот другой метод).

1 голос
/ 04 января 2012

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

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

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