顯示具有 xml 標籤的文章。 顯示所有文章
顯示具有 xml 標籤的文章。 顯示所有文章

2012年10月17日 星期三

[Asp].ASPStringBuilder 和 .net stringer builder 效能比較

最近遇到一個功能, 要匯出資料, 因為效能很差, 要匯很久, 想看看用純 asp 處理比較快, 還是改用 .net 比較快, 分別測試2種方法, 結論是差不多, 要快的話, 中間使用的流程/架構要翻掉, 改用其他方法, 才會有效率.

這一個個案遇到的是 XML 的內容就 71mb, 含 DOM object 一起的話RAM 大約占用 150mb, 在 apply style 套 xsl 時, 瞬間的 RAM 再會多用掉500多MB, 像寫的這麼爛的程式, 真的很怕有很多人同時點下去執行, 應該要把Web Server 弄掉 memory overflow 錯誤.


有圖有真相, 畫面如下:

測試方案1號: 使用 ASP 寫的 StringBuilder(cASPString.asp),
圖片1.1: 程式執行前的RAM, 大約用掉 127mb:

圖片1.2: 程式執行前的RAM, DOM 大約用掉 150mb 左右:
(說明: 由於沒有在用 RAM 回收的太快, 所以數字不太準.)


測試方案2號: 使用 ASP 呼叫 .Net StringBuilder
圖片2.1: 程式執行前的RAM, 大約用掉 133mb:

圖片2.2: 程式執行前的RAM, DOM 大約用掉 150mb 左右:


在 DOM ready 好的時候, 可以看到 RAM 的使用快速成長, 會從 300mb 變 500, 再長大到 700mb, 最後在 860mb 右右停留 2~3秒, 再回來 200MB 左右.

測試結論: 在 Asp 使用 StringBuilder(cASPString.asp), 和呼叫 .Net 的 String Builder 效能上差不多, 主要的瓶頸在 XML 太大.


附上, asp 版本的 StringBuilder.
'====================================
' MODULE:    cASPString.asp
' AUTHOR:    www.u229.no
' CREATED:   May 2006
'====================================
' COMMENT: A fast string class for classic ASP.               
'====================================
' ROUTINES:

' - Public Property Get NumberOfStrings()
' - Public Property Get NumberOfBytes()
' - Public Property Get NumberOfCharacters()
' - Private Sub Class_Initialize()
' - Public Sub Append(sNewString)
' - Public Function ToString()
' - Public Sub Reset()
'====================================


'====================================
Class ASPStringBuilder
'====================================

'// MODULE VARIABLES
Dim m_sArr            '// Array holding the strings.
Dim m_lResize        '// Factor for rezising the array.
Dim m_lStrings       '// Number of strings appended.

'// PROPERTIES
Public Property Get NumberOfStrings()
    NumberOfStrings = m_lStrings
End Property

Public Property Get NumberOfBytes()
    NumberOfBytes = LenB(Join(m_sArr, ""))
End Property

Public Property Get NumberOfCharacters()
    NumberOfCharacters = Len(Join(m_sArr, ""))
End Property

'------------------------------------------------------
' Comment: Initialize default values.
'------------------------------------------------------
Private Sub Class_Initialize()
    m_lResize = CLng(50)
    m_lStrings = CLng(0)
    ReDim m_sArr(m_lResize)
End Sub

'------------------------------------------------------
' Comment: Add a new string to the string array.
'------------------------------------------------------
Public Sub Append(sNewString)

    If Len(sNewString & "") = 0 Then Exit Sub
    
    '// If we have filled the array, resize it.
    If m_lStrings > UBound(m_sArr) Then ReDim Preserve m_sArr(UBound(m_sArr) + m_lResize)

    '// Append the new string to the next unused position in the array.
    m_sArr(m_lStrings) = sNewString
    m_lStrings = (m_lStrings + 1)
End Sub

'------------------------------------------------------
' Comment: Return the strings as one big string.
'------------------------------------------------------
Public Function ToString()
    ToString = Join(m_sArr, "")
End Function

'------------------------------------------------------
' Comment: Reset everything.
'------------------------------------------------------
Public Sub Reset()
    Class_Initialize
End Sub

'====================================
End Class 
'====================================

讓 asp call .net string builder 的方法:
namespace MyObject
{
    public class StringBuilderObject
    {
        public StringBuilder MyStringBuilder = new StringBuilder("");
        public StringBuilderObject()
        {
        }
        public void Append(string value)
        {
            this.MyStringBuilder.Append(value);
        }
        public void Remove(int startIndex, int length)
        {
            this.MyStringBuilder.Remove(startIndex, length);
        }
        public override string ToString()
        {
            return this.MyStringBuilder.ToString();
        }
    }
}

2012年3月5日 星期一

A 站台的條列頁+內容頁,從 B站台取得.

需求: 假設 A站台(客戶網站), 與 B站台(可能是外部網站,或客戶的其他子網站)使用相同的架構. 現在 A 站的 99號節點,要顯示 B站台 33號節點內容. 很像是成語 "移花接木" 的感覺.

解法1: B 站台的資料, 倒進 A 站台.
說明:
1.讓 B站台提供 RSS,
2.在 A站台設排程讀取 B站台 RSS內容進 A站台 database 中.


解法2: A站台直接讀取 B站台 topic list 的資料.
說明:
1.在 A站台的節點(或主題單元) xml 設定檔設定 ExtraListUrl(條列頁) + ExtraDataUrl(內容頁) tag, 把 value 設定為 B站台的 topic list 資料.
2.修改 A站台的的 topic list 程式, 在輸出 topic list 先讀取看看 ExtraListUrl 有值的話, 就讀取 ExtraListUrl 裡設定的 URL 裡的值, 直接輸出.
3.修改 A站台的的 article 程式, 在輸出 article 先讀取看看 ExtraDataUrl 有值的話, 就讀取 ExtraDataUrl 裡設定的 URL 裡的值, 直接輸出.
4.調整要輸出的 block 裡的參數, 要把 B站台的識別用的參數(例如節點), 換成 A站台目前正被執行中的參數.


心得, 如果頁面在輸出時, 是套用 XML 來產生的話, 不同區塊的 block 可能可以直接與其他系統(ap)做共用, 但是這個架構有一個很大的缺點, 就是無法做 page 在 buffer 狀態下的 flush, 一定必須跑完所有的 block 所有的 code 之後, client 端的 browser才看的到畫面.

例如: 傳統的程式架構, 假設您輸出的 html 不是透過 table tag 輸出的情況下, 假設您有10個 block, 每一個 block 的處理時間需要1秒, 每一個 block 的 html 傳輸到 client 端的 browser , browser 可以直接顯示接收到部分的block, 意思是說 browser 可以每秒顯示出一個 block. 反之如果是用 xml + xsl 的架構, browser 只能在10秒後, 一次把10個block 顯示出來.

2011年6月30日 星期四

允許後台的排序與前台不同(Order By)

今天要分享的是, 讓資料在後台的排序欄位與前台不同,
解決方法有2:

───────────────────────────────────
 ■ 方案1: 用 DND
───────────────────────────────────
 ※ 缺點: 之後欄位資料調整, 要改2個(以上) 的 xml.
 ※ 優點: 現行程式不需調整.


───────────────────────────────────
 ■ 方案2: 在 xml 裡增加新的 tag
───────────────────────────────────
 ※ 缺點: 要改寫程式.
 ※ 優點: 多個節點, 都用共同一個 DSD 的情況下, 只需要使用同一支 xml.

step 1: 修改 xml 檔, 增加新的tag.


step 2: 更新 asp 程式及 select box 在使用 xsl 版型.

step 3: 大功告成了, 執行畫面如下:

Facebook 留言板