2016-02-06 3 views
3

Мне нужно преобразовать int в массив байтов в Micro Framework, чтобы его можно было передавать в последовательный порт. Это происходит в чувствительной ко времени области кода, где задержка, вызванная сборщиком мусора, может занять слишком много времени.Листинг int для массива char без воздействия на кучу

Как правило, я передавал int в строку и оттуда в массив символов. Но это создает объект кучи, который рискует сбором мусора.

Есть ли эффективный способ сделать это? Я могу сделать это в цикле, который использует арифметику по модулю 10, но это будет медленным. В C я использовал sprintf для преобразования в предварительно выделенный массив, что было бы хорошо.

+0

Должен ли я предположить, что 'int' преобразован в' string' какой-то магией, которая не включает медленную * modulo 10 арифметику *? – PetSerAl

+0

Сколько там разных ints? Если есть всего несколько общих значений, вы можете выделить все это. Поддержание 'Dic '. – usr

+0

@PetSerAl: modulo 10 арифметики в C# на MF _way_ медленнее, чем по модулю 10 арифметики в собственном коде. – blearyeye

ответ

2

Для таких задач вы можете использовать BitConverter.

Но я бы посоветовал вам взглянуть на ProtoBuf, если вам действительно нужно сжать каждую унцию пространства/производительности из сериализованного двоичного кода. Существует вряд ли лучший/более быстрый способ сериализации данных в двоичные капли. Затем вы сможете отправить это по кабелю или сохранить на диск или сохранить его в памяти для целей кеширования.

+0

Я знаком с BitConverter. Он может преобразовать int в массив байтов с одним и тем же значением бита. Мне нужно что-то, чтобы преобразовать его в десятичные цифры: эквивалент intVal.ToString(). ToCharArray(), но без создания кучного объекта. ProtoBuf, похоже, не применим к Micro Framework. – blearyeye

+0

Объект кучи, скорее всего, является строкой. Вы заглянули в внутренние строки и память? Это может быть нелегко, но, может быть, вы можете выделить 16 байт, закрепить его (не собирать мусор) и записать в этот буфер. Это не было бы потокобезопасным и имело бы много других недостатков, но это то, что можно сделать. «SecureString» обрабатывается таким же образом, чтобы избежать сбора мусора и замены диска конфиденциальными данными. Возможно, вам придется написать свой собственный конвертер, но это не сложно. Реальным виновником здесь является фиксация памяти, насколько я понял вашу проблему. – pid

+0

Эффективность BTW - все, что нужно протестировать, нет гарантии, что закрепленная память быстрее, потому что вам нужно пересечь барьер VM и получить доступ к нему с помощью прямой логики указателя. Я не знаю, ускорит ли это или замедлит ваш код. – pid

1

Не уверен, что он доступен в Micro Framework, но одна из перегрузок BitConverter.GetBytes должна сделать трюк.

+0

Смотрите мой комментарий к @pid – blearyeye

Смежные вопросы