关于C#中 二维数组[,](MD) 和交错数组[][](SZ) 的原理性能问题

本文深入探讨了C#中的一维数组(SZ数组)和多维数组(MD数组)的性能差异,指出SZ数组在性能上优于MD数组。通过IL代码分析和内存字段讲解,展示了SZ数组的优化之处。文章还提到,交错数组虽然性能更好,但不兼容CLS。此外,文章讨论了如何通过非安全代码访问和交错数组来优化性能,并提醒开发者注意大数组对性能的影响。
摘要由CSDN通过智能技术生成

 

★背景知识
首先了解一些相关的概念:
       数组元素:数组包含的值;
       数组长度:数组可以包含的元素的个数;
       维度数:数组的维度总数;
       下限:数组指定的维度的起始索引。多维数组每个维可以有不同的下限。
       运行时有两种不同的数组实现--SZ数组和普通数组。SZ数组是以0为下限的一维数组;普通数组指多维的或者下限不为0的数组。有时候我们称呼多维数组为MD数组。由于SZ数组较常用,微软对它的性能进行了极大的优化。下面的表详细列出了SZ数组与MD数组的区别。

  SZ数组 MD数组
定义 一维的,以0为下限的数组 多维的,或者下限不为0的数组
C#语法

Object[]

Object[][] (交错数组)
Object[,] ---二维数组
是否兼容CLS 兼容(交错数组除外) 不兼容
IL优化 使用专用的IL指令来操作这些数组,比如:ldlenstelem等等 1.0版本,没有专用的IL指令,对数组的所有操作都是通过方法调用来实现
方法优化 基元类型数组有专用的方法,这些方法在操作一些值类型数组时不用反复的装箱,所以具有较高的性能 1.0版本,引用类型和值类型数组使用同样的方法。值类型在方法调用时被反复地装箱和拆箱,造成了极大的性能冲击
基本长度(不包括8字节的方法表指针和对象头)

值类型数组 — 4字节

引用类型数组 — 8字节

值类型数组 — 4+8*rank(维度数)

引用类型数组 — 8+8*rank(维度数)

JIT优化 JIT
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值