用锯齿形数组提高.NET应用程序速度

[复制链接]
查看11 | 回复0 | 2007-9-26 18:42:10 | 显示全部楼层 |阅读模式
锯齿形数组,也称作数组的数组,不仅仅提供在某种条件下的空间存储,而且提供了加强执行。
  在.net中可以使用有的三种类型数组:一维数组,多维数组和锯齿形数组。锯齿形数组,也称作数组的数组,不仅仅在某种条件下提供存储空间,而且象我们示范的一样提供增强执行。
  在本文中,我们将使用一个多维数组和一个锯齿形数组保存一年中的每一天的任意值。两个多维数组将允许我们通过提供月份和天的索引,得到一年中的任何一天。我们应用以下语法声明数组。
Private multi(12, 31) As Integer
Private jagged(12)() As Integer
  注意对于多维数组,我们需要声使用在一个月中可能出天的天数(31)的最大值来声明第二维。在这两维中,既然每一行有同样的列数,可以将一个多维数组考虑成一个方形的。这将导致与一个有效相关的而非所有数组输入的空间浪费,例如,在四月中没有31天。
  另一方面,锯形数组允许你对每一行分配不同列数。在GreateArrays的下列子程序中,在循环之中装配两个数组。注意:锯齿形数组初始化包括附加一步来对每一个月的天数数组分配内存。与多维数组比较起来,对需要的一个月份使用精确数量的存储会节省一少部分存储器。用数组描述年历节省的空间是少量的,但是其它程序节省空间可能是非常重要的。
Private Sub CreateArrays()
 Dim i As Integer
 Dim j As Integer
 Dim random As New Random()
 ' initialize multi dimension array with random data for each day
 For i = 0 To 11
  For j = 0 To DateTime.DaysInMonth(DateTime.Now.Year, i + 1) - 1
   multi(i, j) = random.Next(100)
  Next
 Next
 ' allocate and initialize jagged array with random data
 For i = 0 To 11
  jagged(i) = New Integer(DateTime.DaysInMonth(DateTime.Now.Year, i + 1)) {}
  For j = 1 To DateTime.DaysInMonth(DateTime.Now.Year, i + 1) - 1
   jagged(i)(j) = random.Next(100)
  Next
 Next
End Sub
  显而易见,与一个多维数组相比时候,锯齿形数组因为在循环中分配内存步骤而多需要一小部分时间。然而,当提到存储和重述数组时,你会对锯齿形数组做得比多维数组做的好时而惊奇。在.NET Framework 版本1中,在锯齿形数组的JIT编译器中,已存在了较好的最优化。为了证明这一点,让我们看一看当每次运行测试页时两个最好的子程序。
Private Sub TestSquareArray()
Trace.Write("Beginning TestSquareArray&quot


 Dim i As Integer
 Dim j As Integer
 Dim k As Integer
 Dim sum As Int64
 sum = 0
 For i = 0 To 65525
  For j = 0 To 11
   For k = 0 To DateTime.DaysInMonth(DateTime.Now.Year, j + 1) - 1
    sum = sum + multi(j, k)
   Next
  Next
 Next
 Trace.Write("Ending TestSquareArray&quot

End Sub
Private Sub TestJaggedArray()
 Trace.Write("Beginning TestJaggedArray&quot


 Dim i As Integer
 Dim j As Integer
 Dim k As Integer
 Dim sum As Int64
 sum = 0
 For i = 0 To 65525
  For j = 0 To 11
   For k = 0 To DateTime.DaysInMonth(DateTime.Now.Year, j + 1) - 1
    sum = sum + jagged(j)(k)
   Next
  Next
 Next
 Trace.Write("Ending TestJaggedArray&quot

End Sub
  每一个子程序将每一个数组内的值加求和。我们在另一个大循环中反复这样做,延长计算时间和查看更多的意味深长的时间信息。在我们能够追踪之后,我们能够看下列网页显示的时间信息。存取锯齿形数组的程序往往比多维数组版的快20%。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行