net 性能优化3

如果算法中,需要在函数建立一个临时缓冲并进行运算,可以使用堆栈内存。使用堆栈内存的指针比局部数组的性能更高,这里的高,是说创建内存的速度更快,读写的速度更快。代码例如 byte* ptr = stackalloc byte[1024];

可惜的是, .NET CF并不支持 stackalloc指令,怎么办?

一个办法是调用系统的malloc然后free,pda的.NET CF版本还支持System.Runtime.InteropServices.Marshal.AllocHGlobal()。但是这个方法的毛病就是,一旦忘记了free,那就大灾难了。

另外一个办法是建立一个数组,然后取得指针,例如

byte array = new byte[1024];
fixed (byte* ptr = &array[0])
{
    ...
}

这个方法的优点是,函数退出array的内存被回收,不怕忘记了释放。但缺点就是,要建立受管数组,还要fixed。先不说fixed语句的性能如何,大量被fixed的受管堆,会影响GC的性能。

要解决性能问题,还有个方法,就是提早malloc准备好,但要记得该free就free,否则内存泄漏了。弄个自动释放的内存池是个不错的方法。

没有stackalloc就不能在堆栈上取得内存指针么?答案是有的,例如

[StructLayout(LayoutKind.Sequential, Size = 1024)]
struct s { }

s tmp = new s();
byte* ptr = (byte*)&tmp;

 技术讨论的QQ群: 2514097 或 10987609

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值