Я не использую код с указателями (например, С++), а также с небезопасными островами: только "безопасный" С#. Теперь я хотел бы реализовать функцию в С# для .NET 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 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;
}
}
Улучшение по сравнению с этим более безопасным способом - например, - не так велико (177ms против 224ms), но оно все равно значимо.
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;
}
Примечание. Я сократил код, но думаю, что он достаточно ясен.
Мой вопрос: "трюк", который я сделал путем копирования "фиксированного" указателя на другой незафиксированный, может быть надежным или нет?... Однако вы можете предположить, что все данные статически распределены, поэтому должны быть закреплены. Заранее спасибо. Приветствия