zoukankan      html  css  js  c++  java
  • c#中多维数组技术性能比较

    多维数组的三种技术:安全数组访问技术、安全交错数组访问技术和非安全指针访问技术。

    时间 = 数组生成时间 + 数组元素访问时间

    1、安全数组访问技术:创建较快,访问最慢
              安全数组访问技术最慢。无专用的IL指令。
              安全数组对象生成速度较快,数组的空间是连续的,产生的垃圾少。
         结论:
              如果需要创建大量多维数组,而且并不想频繁地访问这些元素,创建多维数组更快一些。

    2、安全交错数组访问技术:创建较慢,访问较快
              交错数组访问技术较快。因为有专用的1维0基数组的IL指令。
              交错数组对象生成速度慢,数组的空间是不连续的,产生的垃圾多。
          结论:
              如果只需要创建一次多维数组,而且要频繁地访问该数组中的元素,交错数组数组访问较快一些。

    3、非安全指针访问技术:创建较快,访问最快
              非安全数组对象生成速度较快,数组的空间是连续的,产生的垃圾少。
              非安全数组访问技术的速度非常快。因为使用了非安全的指针。
          结论:
              在性能第一的情况下,可采用非安全指针访问技术。
          缺点:
                  这种技术允许在访问数组时关闭索引边界检查。如果这些内存访问是在边界之外,不会抛出异常,
              但可能损坏内存中的数据,破坏类型安全性,进而造成安全漏洞。

    下面我会根据例子和内存分布图,来说明他们的性能:

    1、安全数组访问技术:int[,] a=new int[2,3];

    在内存中会形成如下图:

    c#中clr把多维数组都看做是非0基数组,那么每次clr都会从索引值中减去偏移量来检查数组是否越界,这样效率肯定不会有多高。

    2、安全交错数组访问技术:int[][] a=new int[2][3];

    在内存中会形成如下图所示:

    这样看到这个安全交错数组实际上是由3个0基一维数组组成,一维0基数组有特殊IL指令,而且这些特殊的IL指令会导致JIT编译器生成优化的代码,性能是最佳的,故他要比安全数组性能要好。

    3、非安全指针访问技术:public static int[,] a=new int [,]{{1,2,3},{4,5,6},{7,8,9},{10,11,12}};

    public unsafe static void main()

    fixed(int* py=&a[2,1])

    {

       int* p=py;

     for(int i=0;i<3;i++)

    {

    p++;

    *p=10;

    }

    foreach(int i in a)

    {

    console.writeline(i);

    }

    }

    运行结果为:1 2 3 4 5 6 7 8 19 20 21

    内存图如下:

  • 相关阅读:
    201671030122杨凡亿《英文文本统计分析》结对项目报告
    201671030122杨凡亿 实验二 词频统计软件项目报告
    201671030122杨凡亿 实验三作业互评与改进报告
    通读《现代软件工程—构建之法》后的疑惑
    201671030126 赵佳平 实验十四 团队项目评审&课程学习总结
    201671030126赵佳平《英文文本统计分析》结对项目报告
    201671030126 词频统计软件项目报告
    201671030126 赵佳平 实验三 作业互评与改进报告
    我的问题
    201671030128周琳 实验十四 团队项目评审&课程学习总结
  • 原文地址:https://www.cnblogs.com/yongbufangqi1988/p/1755863.html
Copyright © 2011-2022 走看看