Вагиф Абилов (object) wrote,
Вагиф Абилов
object

Category:

Программистское

У вас есть две структуры данных в .NET.

1. Массив из 8 байт: byte[] b = new byte[8];
2. Структура из 8 байтовых полей: struct s { byte b0; byte b1; ... }

К каким элементам будет быстрее доступ? Или без разницы?

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

Будучи уязвлен собой, сегодня прошелся по коллегам, задавая им этот вопрос. Никто из них не смог обосновать ответ. Значит по крайней мере не я один.


Тест показал, что доступ к элементам массива байтов на 30-40% медленней, чем к полям структуры. Ключевые слова обоснования: boundary check, managed environment. То есть каждый раз, когда мы пишем:

byte b = bytes[i];

в .NET это равносильно такому:

if (i < 0 || i >= bytes.Lenght)
throw new IndexOutOfRangeException("Array index is out of range");
else
// код для возврата элемента массива без проверки границ

в то время как со структурой никаких проверок границ не требуется.

На C/C++ никакой разницы в быстродействии не было бы.

UPDATE: igorm уточнил (и усложнил) происходящее. И он же нашел подтверждение моей версии от Майкрософта: "It's true that there is less IL code for the type-safe version. However, it is the type-safe version's ldelem instruction that causes the CLR to do index checking. The unsafe version uses the ldind.i4 instruction instead; this simply obtains a 4-byte value from a memory address."
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 69 comments