我不习惯使用指针(例如C ++),也不熟悉不安全的编程:只用“安全”的C#。 现在,我想在 .Net Micro Framework 中实现一个函数,其中紧凑性和性能非常重要。 基本上,我想要收集四个short类型的值,并将它们存入缓冲区(例如字节数组)。 假设每个样本都是这样的:
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;
}
}
相对于以下更加安全的方式,改进并不是很大(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;
}
注意:我已经删除了一些代码,但我认为它足够清楚。
我的问题是:通过将“fixed”指针复制到另一个未固定的指针所做的“技巧”是否可靠?...但您可以假设所有数据都是静态分配的,因此应该已固定。 提前致谢。 干杯
fixed
语句中取出托管缓冲区的指针似乎是一个非常糟糕的想法。我不确定,但如果GC妨碍了它可能会有问题。 - R. Martinho Fernandes