科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件用锯齿形数组提高.NET应用程序速度

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

锯齿形数组,也称作数组的数组,不仅仅提供在某种条件下的空间存储,而且提供了加强执行

作者:子夜 来源:天极网 2007年11月9日

关键字: 锯齿形数组 应用程序 速度

  • 评论
  • 分享微博
  • 分享邮件
锯齿形数组,也称作数组的数组,不仅仅提供在某种条件下的空间存储,而且提供了加强执行。

  在.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")

 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")
End Sub

Private Sub TestJaggedArray()
 Trace.Write("Beginning TestJaggedArray")

 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")
End Sub

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

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章