当前位置: 首页 > 编程语言 > C#

UnsafeC#提速技巧分享

时间:2023-04-10 22:40:58 C#

UnsafeC#提速技巧我不习惯用指针编码(像C++)也不习惯使用不安全岛:只用“安全”C#。现在我想在.NetMicroFramework中用C#实现一个功能,其中紧凑性和性能非常重要。基本上,我收集了4个短裤,从而填充了一个缓冲区(例如字节数组)。假设每个样本都是这样的:structMyStruct{publicshortAn1;公开做空An2;公开做空An3;公开做空An4;每个样本都是通过计时器事件收集的,所以我不能循环遍历它(有几个原因)。我已经尝试了多种方法来有效地做到这一点,但表现最好的似乎是这个:unsafestructMyStruct2{publicfixedbyteBuffer[Program.BufferSize];}不安全类程序{publicconstintBufferSize=0x1000;publicconstintArraySize=BufferSize/8;staticMyStruct2_struct2=newMyStruct2();静态我的结构*_structPtr;不安全的静态voidMain(string[]args){intiter=5000;//只是为了模拟许多循环for(inti=0;iAn2=(short)An2();_structPtr->An3=(short)An3();_structPtr->An4=(short)An4();_structPtr++;}//模拟ADC读取staticintAn1(){return0x1111;}staticintAn2(){return0x2222;}staticintAn3(){return0x3333;}staticintAn4(){return0x4444;The方式上的改进-例如-不是那么高(177毫秒对224毫秒),但无论如何它都很重要。staticMyStructTest3(){vardata=newMyStruct();data.An1=(短)An1();data.An2=(短)An2();data.An3=(短)An3();data.An4=(短)An4();返回数据;注意:我已经删除了一些代码,但我认为它已经足够清楚了。我的问题是:我通过将“固定”指针复制到另一个未固定的指针的“技巧”可能可靠吗?...但是你可以假设所有数据都是静态分配的,所以应该是固定的。先感谢您。干杯我不认为代码是安全的。在_structPtr=(MyStruct*)ptr中,在固定范围内,假设_struct2不会移动,然后继续将数据放入_structPtr中。虽然您认为它不会被GC是正确的,但这并不意味着GC不会在内存压缩期间移动它。.NETCompactFramework仍在进行垃圾收集,我认为它会压缩内存而不是分散内存。例如,如果GC删除了在_struct2之前分配在堆上的临时(非静态)对象,则该结构使用的内存可能会移至该临时对象使用的空闲空间。此时_structPtr指向未使用的内存。修改Test3()以获得refMyStruct数据帮助?此外,结帐[StructLayout(LayoutKind.Explicit)]和[FieldOffset(...)]将允许您使用多种方式访问??其中的相同数据。在您的情况下,作为4个字节或1个int或(可能)1个4字节数组。从我广泛使用的一些代码中的不同帖子中查看此示例。您的想法是正确的,您只需要设置FieldOffset()值,然后在访问数据时使用fixed()关键字即可。这种方法非常可靠,但速度不是很快。我使用它的原因是因为当我有很多字段时,我想要一种快速的方法来访问它们作为数组。我不认为你的“把戏”有问题。没有人关心你如何索引内存,或者你使用什么偏移量来做这件事。我认为您需要注意其他人的建议,并确保使用StructLayout.Sequential或.Explicit来控制结构的布局。注意尺寸和包装选项。另一个问题是您需要在固定的块中完成所有工作。fixed(byte*ptr=struct2.Buffer){varstructPtr=(MyStruct*)ptr;变种结构指数=0;做{Test5(structPtr);while(++structIndex就个人而言,我认为你偶然发现了一些微优化剧院,你最好使用安全的C#代码。根据你给出的数字,(224x10^-3-177x10^-3)产生47ms,除以5000次迭代得到每次迭代9.4us(9.4x10^-6)(假设当时windows没有做其他事情)以上是C#学习教程:UnsafeC#技能提升的全部内容极速分享,如果对你有用,需要了解更多C#学习教程,希望大家多多关注---本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处: