Там какое-либо время выполнения стоится за Кастинг в Java?

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

public void doSomething(Supertype input)
{
    Subtype foo = (Subtype)input;
    foo.methodA();
    foo.methodB();
}

по сравнению с.

public void doSomething(Supertype input)
{
    ((Subtype)input).methodA();
    ((Subtype)input).methodB();
}

Какие-либо другие соображения или рекомендации между этими двумя?

34
задан Glen 29 January 2010 в 21:26
поделиться

4 ответа

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

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

30
ответ дан 27 November 2019 в 17:10
поделиться

Вы можете указать его в манифесте, используя манифест вложенный элемент MAR . Set Главный класс к требуемому классу.

-121--2475359-

В первом случае:

Subtype foo = (Subtype)input;

Это определяется в компиляционном времени, поэтому нет стоимости во время выполнения.

Во втором случае:

((Subtype)input).methodA();

Это определяется во время выполнения, потому что компилятор не узнает. JVM должен проверить, может ли он преобразовать в ссылку в ссылку подтип , а если не бросить классов класса и т. Д. Так что будет какая-то стоимость.

-4
ответ дан 27 November 2019 в 17:10
поделиться

Согласно этой статье , существует стоимость, связанная с литьем.

Пожалуйста, обратите внимание, что статья датирована 1999 годом, и читатель сам решает, является ли информация все еще достоверной!

1
ответ дан 27 November 2019 в 17:10
поделиться

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

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

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

8
ответ дан 27 November 2019 в 17:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: