C # Вызов метода Class / Interface (собственный код, стоимость) - PullRequest
1 голос
/ 26 апреля 2010

Предположим, у нас есть класс A, который реализует интерфейс I

.
I i = new A();
i.method(); // example 1
A a = (A)i;
a.method() // example 2

Код IL, сгенерированный для каждого вызова метода (), одинаков, но какой из вызовов метода «метод ()» дороже в нативном коде и почему?

Любая помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 26 апреля 2010

Если код IL такой же, то (стоимость) собственного кода будет.Почему JIT относится к ним по-другому?

1 голос
/ 26 апреля 2010

Как правило, вызов ((A)a).method() будет (очень немного) быстрее, так как JIT-компилятор знает (статически) конкретный метод, который должен быть вызван, и поэтому может вызывать A.method напрямую.Вызов его через интерфейс I требует проверки во время выполнения фактического типа объекта, на который указывает ссылка, и последующей отправки этой реализации.Однако у меня нет ссылок на это.

Я знаю, что компилятор Java JIT имеет некоторые оптимизации в этом отношении, так как каждый вызов метода является виртуальным - он предполагаеткэширует наиболее часто используемую реализацию конкретного метода интерфейса и оптимизирует для этого случая..NET JIT не нуждается в этом почти так же сильно, как методы должны быть явно виртуальными.

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

...