zoukankan      html  css  js  c++  java
  • 数组

      1 static void Main(string[] args)
      2         {
      3             //数组是引用类型,除了数组元素,还包含一个类型对象指针,一个同步索引块,和一些开销字段
      4             //创建一个值类型数组,会在托管堆上分配容纳100个未装箱值类型所需的内存块。
      5             //引用类型只创建了一组引用,没有实际对象
      6             #region 数组隐试实现IList,ICollection,IEnumerable
      7             //FileStream[] fsArray;//CLR会自动使数组实现IList<T>,ICollection<T>,IEnumerable<T>接口
      8             ////值类型因为内存布局不同,不会实现上面的接口
      9             //fsArray = new FileStream[3];
     10             //M1(fsArray);
     11             //M2(fsArray);
     12             //M3(fsArray);
     13             #endregion
     14 
     15             // DynamicArrays();
     16 
     17             ArrayTypes();
     18 
     19 
     20 
     21         }
     22 
     23         static void M1(IList<FileStream> f1)
     24         {
     25 
     26         }
     27 
     28         static void M2(ICollection<Stream> f2)
     29         {
     30 
     31         }
     32 
     33         static void M3(IEnumerable<object> f3)
     34         {
     35 
     36         }
     37 
     38         #region 创建下限非0数组
     39 
     40         static void DynamicArrays()
     41         {
     42             Int32[] lowerBounds = { 2005, 1 };
     43             Int32[] lengths = { 5, 4 };
     44             Decimal[,] quarterlyRevenue = (Decimal[,])Array.CreateInstance(typeof(Decimal), lengths, lowerBounds);
     45             quarterlyRevenue[2005, 1] = 10;
     46         }
     47         #endregion
     48 
     49         #region 数组访问性能
     50 
     51         static void ArrayTypes()
     52         {
     53             Array a;
     54 
     55             // Create a 1-dim, 0-based array, with no elements in it
     56             a = new String[0];
     57             Console.WriteLine(a.GetType()); // System.String[]
     58 
     59             // Create a 1-dim, 0-based array, with no elements in it
     60             a = Array.CreateInstance(typeof(String), new Int32[] { 0 }, new Int32[] { 0 });
     61             Console.WriteLine(a.GetType()); // System.String[]
     62 
     63             // Create a 1-dim, 1-based array, with no elements in it
     64             a = Array.CreateInstance(typeof(String), new Int32[] { 0 }, new Int32[] { 1 });
     65             Console.WriteLine(a.GetType()); // System.String[*]  <-- INTERESTING!下限非0数组
     66 
     67             Console.WriteLine();
     68 
     69             //将所有多维数组都视为下限非0数组
     70 
     71             // Create a 2-dim, 0-based array, with no elements in it
     72             a = new String[0, 0];
     73             Console.WriteLine(a.GetType()); // System.String[,]
     74 
     75             // Create a 2-dim, 0-based array, with no elements in it
     76             a = Array.CreateInstance(typeof(String), new Int32[] { 0, 0 }, new Int32[] { 0, 0 });
     77             Console.WriteLine(a.GetType()); // System.String[,]
     78 
     79             // Create a 2-dim, 1-based array, with no elements in it
     80             a = Array.CreateInstance(typeof(String), new Int32[] { 0, 0 }, new Int32[] { 1, 1 });
     81             Console.WriteLine(a.GetType()); // System.String[,]
     82         }
     83 
     84         private const Int32 c_numElements = 10000;
     85         public static void MultiDimArrayPerformance()
     86         {
     87 
     88             const Int32 testCount = 10;
     89             Stopwatch sw;
     90 
     91             // Declare a 2-dimensional array
     92             Int32[,] a2Dim = new Int32[c_numElements, c_numElements];
     93 
     94             // Declare a 2-dimensional array as a jagged array (a vector of vectors)
     95             Int32[][] aJagged = new Int32[c_numElements][];
     96             for (Int32 x = 0; x < c_numElements; x++)
     97                 aJagged[x] = new Int32[c_numElements];
     98 
     99 
    100             // 1: Access all elements of the array using the usual, safe technique
    101             sw = Stopwatch.StartNew();
    102             for (Int32 test = 0; test < testCount; test++)
    103                 Safe2DimArrayAccess(a2Dim);
    104             Console.WriteLine("{0}: Safe2DimArrayAccess", sw.Elapsed);
    105 
    106             // 2: Access all elements of the array using the jagged array technique
    107             sw = Stopwatch.StartNew();
    108             for (Int32 test = 0; test < testCount; test++)
    109                 SafeJaggedArrayAccess(aJagged);
    110             Console.WriteLine("{0}: SafeJaggedArrayAccess", sw.Elapsed);
    111 
    112             // 3: Access all elements of the array using the unsafe technique
    113             sw = Stopwatch.StartNew();
    114             for (Int32 test = 0; test < testCount; test++)
    115                 Unsafe2DimArrayAccess(a2Dim);
    116             Console.WriteLine("{0}: Unsafe2DimArrayAccess", sw.Elapsed);
    117             Console.ReadLine();
    118         }
    119 
    120         //普通访问,数组创建是比交错数组快,但访问效率最低
    121         private static Int32 Safe2DimArrayAccess(Int32[,] a)
    122         {
    123             Int32 sum = 0;
    124             for (Int32 x = 0; x < c_numElements; x++)
    125             {
    126                 for (Int32 y = 0; y < c_numElements; y++)
    127                 {
    128                     sum += a[x, y];
    129                 }
    130             }
    131             return sum;
    132         }
    133 
    134         //交错访问,效率和不安全访问相近,但创建数组是开销较大
    135         private static Int32 SafeJaggedArrayAccess(Int32[][] a)
    136         {
    137             Int32 sum = 0;
    138             for (Int32 x = 0; x < c_numElements; x++)
    139             {
    140                 for (Int32 y = 0; y < c_numElements; y++)
    141                 {
    142                     sum += a[x][y];
    143                 }
    144             }
    145             return sum;
    146         }
    147 
    148         //使用不安全的指针访问数组,效率最高
    149         private static unsafe Int32 Unsafe2DimArrayAccess(Int32[,] a)
    150         {
    151             Int32 sum = 0;
    152             fixed (Int32* pi = a)
    153             {
    154                 for (Int32 x = 0; x < c_numElements; x++)
    155                 {
    156                     Int32 baseOfDim = x * c_numElements;
    157                     for (Int32 y = 0; y < c_numElements; y++)
    158                     {
    159                         sum += pi[baseOfDim + y];
    160                     }
    161                 }
    162             }
    163             return sum;
    164         }
    165 
    166         #endregion
    167 
    168         #region 使用stackalloc创建值类型数组
    169 
    170         private static void StackallocDemo()
    171         {
    172             unsafe
    173             {
    174                 const Int32 width = 20;
    175                 Char* pc = stackalloc Char[width];  // 在栈上分配数组
    176 
    177                 String s = "Jeffrey Richter";   // 15 字符
    178 
    179                 for (Int32 index = 0; index < width; index++)
    180                 {
    181                     pc[width - index - 1] =
    182                        (index < s.Length) ? s[index] : '.';
    183                 }
    184                 Console.WriteLine(new String(pc, 0, width));    // ".....rethciR yerffeJ"
    185             }
    186         }
    187 
    188         private static void InlineArrayDemo()
    189         {
    190             unsafe
    191             {
    192                 CharArray ca;   // 在栈上分配数组
    193                 Int32 widthInBytes = sizeof(CharArray);
    194                 Int32 width = widthInBytes / 2;
    195 
    196                 String s = "Jeffrey Richter";   // 15 字符
    197 
    198                 for (Int32 index = 0; index < width; index++)
    199                 {
    200                     ca.Characters[width - index - 1] =
    201                        (index < s.Length) ? s[index] : '.';
    202                 }
    203                 Console.WriteLine(new String(ca.Characters, 0, width)); // ".....rethciR yerffeJ"
    204             }
    205             #endregion
    206 
    207         }
    208         private unsafe struct CharArray
    209         {
    210             // 数组内联欠入
    211             public fixed Char Characters[20];
    212         }
  • 相关阅读:
    PAT A1108 Finding Average [字符串处理]
    PAT A1013 Battle Over Cities [图的遍历]
    关于斐波那契数列的算法
    关于浏览器的事件队列
    类型与进制转换
    【待整理】python 关键字
    闭包和函数的自运行
    cookie-cart购物车
    有意思的效果——左右摇摆
    工厂模式
  • 原文地址:https://www.cnblogs.com/Tan-sir/p/6106101.html
Copyright © 2011-2022 走看看