Генераторы исходного кода C#: генерируйте другой код для вызовов одного и того же метода.C#

Место общения программистов C#
Anonymous
Генераторы исходного кода C#: генерируйте другой код для вызовов одного и того же метода.

Сообщение Anonymous »

Я изложу свой вопрос на конкретном примере. Актуальный вопрос находится внизу этого текста.
Введение
Я хотел бы извлечь некоторые невыровненные данные. из массивов байтов, где указаны
  • позиция начального бита
  • количество битов
  • независимо от того, имеют ли данные формат «сначала старший бит (с обратным порядком байтов)» или «сначала младший бит» (с прямым порядком байтов)
Для этого я создал Bitpacker< /code> класс, предлагающий статический метод

Код: Выделить всё

  ulong ReadRaw(byte[] src, int startBit, int bitLength, Endianness endianness = Endianness.LSB_FIRST)
Этот метод, конечно, должен выполнить некоторые вычисления, чтобы получить нужные биты из байтов, используя циклы и т. д., что медленно. Мне нужно оценивать данные порядка нескольких тысяч раз в секунду.
Поскольку аргументы представляют собой константы, известные во время компиляции, я мог бы жестко запрограммировать быстрый вариант, вручную находя, какие биты нужно извлечь и как их сдвинуть.
Например. следующие два присваивания raw делают то же самое:

Код: Выделить всё

ulong raw;

// Manually extract bits
raw = ((ulong)(src[5] & 0xFC) >> 2) + ((ulong)(src[6] & 0x3) 

Подробнее здесь: [url]https://stackoverflow.com/questions/75015758/c-sharp-source-generators-generate-different-code-for-calls-to-the-same-method[/url]

Вернуться в «C#»