Я нашел это странное поведение в .NET и даже после того, как снова просмотрел CLR через С#, я все еще запутался. Предположим, что у нас есть интерфейс с одним методом и классом, который его реализует:
interface IFoo
{
void Do();
}
class TheFoo : IFoo
{
public void Do()
{
//do nothing
}
}
Затем мы хотим просто создать экземпляр этого класса и вызвать этот метод Do() много раз двумя способами: используя конкретную переменную класса и используя переменную интерфейса:
TheFoo foo1 = new TheFoo();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (long i = 0; i < 1000000000; i++)
foo1.Do();
stopwatch.Stop();
Console.Out.WriteLine("Elapsed time: " + stopwatch.ElapsedMilliseconds);
IFoo foo2 = foo1;
stopwatch = new Stopwatch();
stopwatch.Start();
for (long i = 0; i < 1000000000; i++)
foo2.Do();
stopwatch.Stop();
Console.Out.WriteLine("Elapsed time: " + stopwatch.ElapsedMilliseconds);
Удивительно (по крайней мере для меня) прошедшие времена примерно на 10% различны:
Elapsed time: 6005
Elapsed time: 6667
Разница не так уж и много, поэтому я бы не стал об этом беспокоиться в большинстве случаев. Однако я просто не могу понять, почему это происходит даже после просмотра кода IL, поэтому я был бы признателен, если бы кто-то указал мне на что-то очевидное, что мне не хватает.