none
Label顯示HTML很慢 RRS feed

  • 問題

  • 有個需求必須由後端拉很多資料出來組合成一個字串變數,這個字串變數包含了一般的HTML碼,最後再把它餵給Label去顯示出來,只是當資料量一大時,這個顯示就會很慢,甚至timeout,有沒有什麼建議解法呢?
     
    試過Label 及 literal 效果都不佳
    例如要顯300行30格的table
    就慢到會timeout
     
    2007年3月28日 上午 05:21
    版主

解答

  • 你可以由二個部份來診斷:

    • 伺服器輸出的時間,如果輸出時間很長,表示字串產生確有瓶頸,此時應該改善產生字串的方法 .
    • 用戶端繪出頁面的時間,如果伺服器已經輸出但繪出時間很長,表示是用戶端瀏覽器的效能問題,此時只在伺服器端修改,效果有限(也可能是完全沒效,因為是用戶端的問題).
    2007年3月28日 上午 07:41
    版主
  • 如果你僅只是利用Label輸出Html code,Label是不會parse你輸入的Code

    不管你給它的是table還是textbox,對它而言都是字串

    它的輸出也僅是將text的值直接輸出到HtmlTextWriter

    所以如果是資料量過大,造成輸出過慢

    這部份其實是沒有辦法改善的

     

    不過照正常來說,如果只是繪製上千個格子,

    資料量是不可能慢到Timeout的,應該還是其他地方的程式碼的效能出現問題

    所以才會建議改用StringBuilder,因為用+=方式組字串消耗的資源相當大

     

    因此,還是把這部份的程式碼貼上來吧,不然也無法判斷真正的原因是什麼

    2007年3月28日 上午 07:52
  • 先前有討論過,不過我沒搜尋到。

    直接用字串組合比如說相加,不論你是用 string += 或是 StringBuilder 都一樣,因為字串相加本來就會很吃效能。

     

    所以這時應該改用 Join 或是直接輸出到 MemoryStream ,最後再用 ToString 轉回來,兩種方法都沒有相加問題,就會快很多。

     

    Join C# 可以用 String.Join 來處理。VB 可用 Join 函數。

     

    假設 Table 有 nRow, nCol ,以 VB 為例:


    Code Snippet

    Dim strRows(nRow) As String

     

    For ibr As Integer = 0 To nRow

       Dim strCols(nRow) As String

       For ibc As Integer = 0 To nCol

          strCols(ibc) = tablexxx(ibr, ibc) ' 做你喜歡的字串組合

       Next

       strRows(ibr) = Join(strCols, "") ' 用你的結合關鍵字

    Next

    Label.Text = Join(strRows, "") ' 用你的結合關鍵字

     


    會快的原因是,你不是每次都把整個字串拿下去做 += 的計算。+= 這個隨字串長度越長,效能越差,請避免。

    2007年3月28日 上午 08:54
    版主

所有回覆

  • 你字串怎麼組的? 直接用+組嗎?

    改用StringBuilder來組字串速度會快很多

    2007年3月28日 上午 05:39
  • 但是感覺慢是慢在Label把程式餵給它的html轉成前端畫面顯示的時候

    改成StringBuilder來組字串也會提升效能嗎?

     

    由於沒用過StringBuilder,所以有這個疑問,還望不吝指導

    2007年3月28日 上午 06:03
    版主
  • 把你這段相關程式碼貼出來。

    前面就有人問你如何組字串了,你根本沒說到重點。

    2007年3月28日 上午 06:24
    版主
  • 1.組字串原始是用+=沒錯

    2.改用StringBuilder方式,有稍微進步

    3.慢在前端顯示HTML,就像我說的可能有上千個格子,格子裡可能還會有textinput

     

     

     

    To璉璉

    不是我沒了解到重點,而是一開始我就懷疑是畫面load的時間慢,所以才會提出如果只是改組字串的寫法,可能沒有很大的效用,目前測的結果也是如此,雖有提升,但依然無法解決問題

    2007年3月28日 上午 07:18
    版主
  • 你可以由二個部份來診斷:

    • 伺服器輸出的時間,如果輸出時間很長,表示字串產生確有瓶頸,此時應該改善產生字串的方法 .
    • 用戶端繪出頁面的時間,如果伺服器已經輸出但繪出時間很長,表示是用戶端瀏覽器的效能問題,此時只在伺服器端修改,效果有限(也可能是完全沒效,因為是用戶端的問題).
    2007年3月28日 上午 07:41
    版主
  • 如果你僅只是利用Label輸出Html code,Label是不會parse你輸入的Code

    不管你給它的是table還是textbox,對它而言都是字串

    它的輸出也僅是將text的值直接輸出到HtmlTextWriter

    所以如果是資料量過大,造成輸出過慢

    這部份其實是沒有辦法改善的

     

    不過照正常來說,如果只是繪製上千個格子,

    資料量是不可能慢到Timeout的,應該還是其他地方的程式碼的效能出現問題

    所以才會建議改用StringBuilder,因為用+=方式組字串消耗的資源相當大

     

    因此,還是把這部份的程式碼貼上來吧,不然也無法判斷真正的原因是什麼

    2007年3月28日 上午 07:52
  • 先前有討論過,不過我沒搜尋到。

    直接用字串組合比如說相加,不論你是用 string += 或是 StringBuilder 都一樣,因為字串相加本來就會很吃效能。

     

    所以這時應該改用 Join 或是直接輸出到 MemoryStream ,最後再用 ToString 轉回來,兩種方法都沒有相加問題,就會快很多。

     

    Join C# 可以用 String.Join 來處理。VB 可用 Join 函數。

     

    假設 Table 有 nRow, nCol ,以 VB 為例:


    Code Snippet

    Dim strRows(nRow) As String

     

    For ibr As Integer = 0 To nRow

       Dim strCols(nRow) As String

       For ibc As Integer = 0 To nCol

          strCols(ibc) = tablexxx(ibr, ibc) ' 做你喜歡的字串組合

       Next

       strRows(ibr) = Join(strCols, "") ' 用你的結合關鍵字

    Next

    Label.Text = Join(strRows, "") ' 用你的結合關鍵字

     


    會快的原因是,你不是每次都把整個字串拿下去做 += 的計算。+= 這個隨字串長度越長,效能越差,請避免。

    2007年3月28日 上午 08:54
    版主
  • 測試過把每個server端事件的run time時間收集起來看,在server端跑的時候還不錯,改成StringBuilder當然更佳了一些

    所以時間慢大部份都還是出現畫面load成html的時候

     

    字串裡包含<td></td>,<input type="text">,及style

     

    同意你的看法:

    如果你僅只是利用Label輸出Html code,Label是不會parse你輸入的Code

    不管你給它的是table還是textbox,對它而言都是字串

    它的輸出也僅是將text的值直接輸出到HtmlTextWriter

    所以如果是資料量過大,造成輸出過慢

    這部份其實是沒有辦法改善的

    2007年3月28日 上午 08:55
    版主
  • 嗯  這倒是可以再試看看 或多或少增加一些server端run的效能也不錯,感謝囉

     

    2007年3月28日 上午 08:57
    版主
  •  伊恩 寫信:

    測試過把每個server端事件的run time時間收集起來看,在server端跑的時候還不錯,改成StringBuilder當然更佳了一些

    所以時間慢大部份都還是出現畫面load成html的時候

     

    那就是我說的第二個狀況了,這時你只有減少輸出(建議),或者改善用戶端環境(叫使用者忍耐或是換電腦 ...)

    2007年3月28日 上午 09:17
    版主