【问题标题】:Can this slow running VB.Net code be improved in any way?可以以任何方式改进这个运行缓慢的 VB.Net 代码吗?
【发布时间】:2011-11-22 16:29:57
【问题描述】:

下面的代码在我的应用程序中运行,运行大约需要 2 - 6 秒,平均大约需要 3-4 秒。我知道存储过程在一秒钟内执行,所以问题一定出在我的 VB.Net 代码上。我能做些什么来提高性能吗?

到目前为止,我通过让存储的 proc 返回一些准备好插入每个元素的 HTML 而不是在循环中包含多个 IF 语句来稍微加快它的速度,并且我将循环更改为 While 而不是每个这有点帮助。我假设某些性能问题可能与服务器有关,但我也想知道我的代码中是否有任何可以改进的地方。

谢谢

   Private Sub dbGetOpenUnassignedTickets()

      ' Here we need to get the results of the query
      Dim Events As New DataTable()

      Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("Blueprint").ToString())

      Dim cmd As New SqlCommand
      cmd.CommandType = CommandType.StoredProcedure
      cmd.CommandText = "spGetUnassignedTickets"

      cmd.Connection = conn

      Using da As New SqlDataAdapter(cmd)
         conn.Open()
         da.Fill(Events)
         conn.Close()
      End Using

      Dim TicketHTML As String = String.Empty
      Dim counter As Integer = 0
      While (counter < Events.Rows.Count - 1)

         Dim strDragDrop As String

         strDragDrop = "onmousedown='return DayPilotCalendar.dragStart(this.parentNode, 60*30, """ & Events.Rows(counter)("TicketID") & """, ""EE"");'"

         'IF Current user <> looking at their own schedule AND not allowed to assign tickets
         If (Session("UserID") <> ddlUser.SelectedValue And Session("AssignTickets") = 0) Then
            strDragDrop = String.Empty
         End If

         TicketHTML = TicketHTML + Events.Rows(counter)("SeverityHTML")

         TicketHTML = TicketHTML + "<table width='100%' " + strDragDrop + ">"

         TicketHTML = TicketHTML + Events.Rows(counter)("TypeHTML")

         TicketHTML = TicketHTML + Events.Rows(counter)("ProductHTML")

         TicketHTML = TicketHTML + "<tr>"
         TicketHTML = TicketHTML + "<td colspan='2'><b>Description</b> <br />" + Events.Rows(counter)("DescriptionHTML") + "</td>"

         TicketHTML = TicketHTML + "</tr>"

         TicketHTML = TicketHTML + "<tr>"
         TicketHTML = TicketHTML + "<td>"
         TicketHTML = TicketHTML + "<b>Logged Date:</b>"
         TicketHTML = TicketHTML + "</td>"
         TicketHTML = TicketHTML + "<td align='left'>"
         TicketHTML = TicketHTML + Events.Rows(counter)("LogDate")
         TicketHTML = TicketHTML + "</td>"
         TicketHTML = TicketHTML + "</tr>"

         TicketHTML = TicketHTML + "</table>"
         TicketHTML = TicketHTML + "</div>"

         counter = counter + 1

      End While

      ' And now update the inner HTML of the thing we are putting the tickets into
      divTickets.InnerHtml = TicketHTML

   End Sub

【问题讨论】:

    标签: asp.net vb.net performance .net-4.0


    【解决方案1】:

    我建议您使用 SqlDataReader 进行数据检索,使用 StringBuilder 构建您的 HTML。

    您还可以更改或制作仅返回所需列的 spGetUnassignedTickets 的新版本。

    【讨论】:

    • 感谢 Rick StringBuilder 是解决方案。它现在几乎可以立即运行,不幸的是我实际上无法编辑存储的过程以返回更少的列,因为它需要它返回的所有列
    【解决方案2】:

    TicketHTML 改为 stringbuilder 以加快字符串部分

    【讨论】:

      【解决方案3】:

      正如其他人所建议的那样,StringBuilder 将大大提高您的速度(尤其是在您使用大量记录的情况下)。

      我还会用For Each dr As DataRow in Events.Rows 循环这些行,然后说dr("TypeHtml") 而不是Events.Rows(counter)("TypeHTML") 等...

      【讨论】:

      • 我完全按照您的建议将循环作为 foreach,但奇怪的是 while 循环更快。现在我使用了一个 stringbuilder 我可能会尝试将循环放回 foreach 看看它是否会影响性能
      • @Purplegoldfish 很有趣——我只是认为重复访问Events.Rows(counter) 会比在循环中提供引用(即dr)要慢。但是 StringBuilder 肯定会给你一个改进,特别是如果你正在制作一个非常大的字符串。 Have a look at this article
      • 我本来以为 for each 循环也更快,目前它确实加载得如此之快,以至于无论哪种方式的性能都不是真正的问题,但我肯定会再次尝试 for each 循环,即使只是为了我自己的好奇心。感谢您的文章,我只是在谷歌上搜索一下为什么 stringbuilder 更快
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-23
      • 2013-02-04
      • 2020-10-15
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多