1. 程式人生 > >c#中多維陣列技術性能比較

c#中多維陣列技術性能比較

源地址:http://www.cnblogs.com/yongbufangqi1988/archive/2010/06/10/1755863.html

多維陣列的三種技術:安全陣列訪問技術、安全交錯陣列訪問技術和非安全指標訪問技術。

時間 = 陣列生成時間 + 陣列元素訪問時間

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

記憶體圖如下:

相關推薦

c#陣列技術性比較

源地址:http://www.cnblogs.com/yongbufangqi1988/archive/2010/06/10/1755863.html 多維陣列的三種技術:安全陣列訪問技術、安全交錯陣列訪問技術和非安全指標訪問技術。 時間 = 陣列生成時間 + 陣列元素

numpy陣列的軸 axis

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C#陣列int[,]與交叉陣列int[][]的區別

首先說一下交叉陣列這個東西是C#裡面的,c++裡面是沒有的交叉陣列這個定義的   int[][] 是陣列的陣列,即一個一維陣列的每個元素都是一個數組,這個在C++,java等語言裡面也是這麼定義的; int[,]這個是C#中提供的一個二維陣列的形式,在C++中並不存在

C/C++陣列和指標關係分析

        在C/c++中,陣列和指標有著密切的關係,有很多地方說陣列就是指標式錯誤的一種說法。這兩者是不同的資料結構。其實,在C/c++中沒有所謂的二維陣列,書面表達就是陣列的陣列。我猜想是為了表述方便才叫它二維陣列。       在本文中,我也就叫它二維陣列。在C/C

c++陣列與二向量的長度

對於一個二維陣列: int mm[3][5] = { { 1,2,3,4,5 },{ 5,6,7,8,9 },{ 9,10,11,12,13 } }; int toatlnums = sizeof(mm) / sizeof(int); //元素總個數 int cols =

numpy陣列的軸(axis)

多維陣列的軸(axis=)是和該陣列的size(或者shape)的元素是相對應的; >>> np.random.seed(123) >>> X = np.random.randint(0, 5, [3, 2, 2]) >>&

c語言陣列與指標

一.前言: 對於陣列想必大家都不陌生首先得要知道的是對於陣列元素在記憶體儲存是連續性的。 例如: char a[10]    //那麼陣列a的各個原數在記憶體中的儲存地址為:0X01~0X10 而一維陣列相對於多維陣列來說很簡單的,然而陣列a就表示的是整個陣列記憶

C#陣列

     生活中,有很多事物,僅僅用一維陣列,將無法恰當地被表示。還是說學生成績管理吧。一個班級30個學員,你把他們編成1到30號,這很好。但現在有兩個班級要管理怎麼辦?人家每個班級都自有自的編號,比如一班學生編是1~30;二班的學生也是1~30。你說,不行,要進行計算機管理,你們兩班學員的編號要混在一起,

C++陣列總結

最近程式設計需要研究了一下二維陣列,網上這方面的資料蠻多了,彙總一下,歡迎補充! 關於二維資料的基本知識見這裡: 關於二維資料的動態分配,以下部落格講述得比較清楚: 舉例: //動態定義一維陣列、二維陣列、三維陣列 #include<iostream>

C#獲取陣列的行數與列數

效果圖: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.

C++陣列的使用

1 定義 在C++中,如果陣列的元素又是陣列,則稱為二維陣列,其每一維對應一個下標,第一維通常稱為行(row),第二維則稱為列(column)。例如 int a[2][3]; 可以將二維陣列a看成是一個2行3列的矩陣。 2 初始化 2.1使用花括號進行初始化 可以使用花括號

C++陣列的初始化

在C++中,二位陣列有兩種使用方式。 第一種是靜態宣告及初始化,如下: int array2[3][2]={{4,2},{5},{6}};第二種是,有時我們不知道二維陣列需要多少行和多少列,這時是動態陣列。 int **array; 後來我們通過輸入來獲取陣列的行n

javascript陣列的使用

<html> <head> <title> myweb </title> </head> <body>

徹底搞清C/C++陣列,二陣列,指標,陣列指標和指標陣列以及指向指標的指標,行地址和列地址之間的關係

#include <iostream> using namespace std; void test(char **ptr) { for(;(strcmp(*ptr,"NULL"))!=0;ptr=ptr+1)        cout << *(ptr) <&l

C++的動態陣列

  [前言]C++的new操作符是該語言一個非常好的語法特性,然而實際使用中卻發現new操作符有不少限制,為突出的一點便是用new操作符分配多維陣列空間時,不能讓陣列的每一維都動態可變。本文將對此提出一個簡單直觀的解決方案,在一個實際問題的簡化模型中加以說明,並以此釋清許多初

C#陣列和交錯陣列

C#中有多維陣列和交錯陣列,兩者有什麼區別呢! 直白些,多維陣列每一行都是固定的,交錯陣列的每一行可以有不同的大小。 以二維的舉例,二維陣列就是m×n的矩陣,m行n列;而交錯陣列(又叫鋸齒陣列)有m

C++ 用new 動態建立陣列

例:              int **array=new int*[n];       &nbs

C語言陣列與二陣列

int arr [4]  //定義了一個一維陣列,長度為4;說明以下三個分別是什麼型別; (1)arr //型別為int *,表示陣列元素首地址,即圖中箭頭指向的位置。 (2)arr+1 //型別為int *,表示陣列元素首地址+1,即圖中箭頭指向的位置。 (3)arr [0

lua陣列與一陣列的相互轉換

探究多維陣列與一維陣列的轉換是有實際意義的, 如: 1、給定一個立方體內座標、一個順序,問此座標在立方體內按此順序數,在第幾個; 2、給定一堆物體,按某一順序放在立方體的各座標上,問最後一個會放在何處? 那麼,三維要如何轉為一維陣列呢? 最容易想到的方式:維護一個遞增變數,然後遍歷,

C程式設計--指標(用 “ 函式 ” 對 “ 陣列 ” 進行操作)

用指向陣列的指標做函式的引數 問題描述 有一個班,3個學生,各4門課,計算總平均分以及第n個學生的成績。 程式碼實現 #include<stdio.h> void average(float *p,int n);//