Я не привык кодировать с помощью указателей (например, C ++) и небезопасных островов: только «безопасный» C #.
Теперь я хотел бы реализовать функцию в C # для .Net Micro Framework, где компактность и производительность очень важны.
По сути, я хотел бы собрать 4-кратные шорты и таким образом заполнить буфер (например, байтовый массив).
Допустим, что каждый образец такой:
struct MyStruct
{
public short An1;
public short An2;
public short An3;
public short An4;
}
Каждый сэмпл собирается с помощью события таймера, поэтому я не могу выполнить цикл (есть несколько причин).
У меня есть много способов, чтобы эффективно сделать это, но наиболее эффективный, кажется, этот:
unsafe struct MyStruct2
{
public fixed byte Buffer[Program.BufferSize];
}
unsafe class Program
{
public const int BufferSize = 0x1000;
public const int ArraySize = BufferSize / 8;
static MyStruct2 _struct2 = new MyStruct2();
static MyStruct* _structPtr;
unsafe static void Main(string[] args)
{
int iter = 5000; //just for simulate many cycles
for (int i = 0; i < iter; i++)
{
//let's make a trick!
fixed (byte* ptr = _struct2.Buffer)
_structPtr = (MyStruct*)ptr;
_structIndex = 0;
do
{
Test5();
} while (++_structIndex < ArraySize);
}
Console.ReadKey();
}
unsafe static void Test5()
{
_structPtr->An1 = (short)An1();
_structPtr->An2 = (short)An2();
_structPtr->An3 = (short)An3();
_structPtr->An4 = (short)An4();
_structPtr++;
}
//simulations of ADC reading
static int An1()
{
return 0x1111;
}
static int An2()
{
return 0x2222;
}
static int An3()
{
return 0x3333;
}
static int An4()
{
return 0x4444;
}
}
Улучшение по сравнению с этим следующим более безопасным способом, например, не так высоко (177 мс против 224 мс), но оно в любом случае является значительным.
static MyStruct Test3()
{
var data = new MyStruct();
data.An1 = (short)An1();
data.An2 = (short)An2();
data.An3 = (short)An3();
data.An4 = (short)An4();
return data;
}
Примечание: я вырезал некоторый код, но я думаю, что он достаточно ясен.
Мой вопрос: «трюк», который я сделал, копируя «фиксированный» указатель на другой незафиксированный, мог быть надежным или нет? ... Однако вы можете предположить, что все данные статически размещены, поэтому должны быть закреплены.
Заранее спасибо.
Приветствия