ASP中處理#include
ASP中處理#include
在ASP中處理#include 檔案與用編譯進階程式設計語言,如C/C++處理包含檔案,這兩種方法之間有兩個主要區別。
第一,ASP不從最終形成的ASP檔案中移走那些未涉及到的資訊。這是因為ASP獨立於指令碼引擎,不過多地進行代碼
分析。大體說來,如果遇到了ASP檔案的基本文法請求,資訊就被緩衝(假定緩衝器是開啟的)並被發送到適當
的指令碼引擎,進行進一步的分解、標記及執行。
除了這個“死碼”問題,ASP包含檔案與編譯語言之間的另一個區別在於:每個ASP檔案都可以被看作它自己
的程式。只要一個頁面不包含另一個,在ASP的意義上看來它們就沒有關係,儘管二者對整個網站的運行都很
關鍵。因此,被兩個不同頁面所共用的一個#include 檔案必須要被兩個檔案都完全包含。從本質上說,ASP不具
備許多進階語言所具備的連接器的優勢,連接器可以用來避免包含檔案中代碼和資料的冗餘。
如果把我所概括的ASP包含檔案的問題組合起來,結論就是:它對一個大型網站的記憶體將是破壞性的。想象
一下這種情況:一個包含檔案中包含了可能要用到的所有共用程式。按照這種設計,導致的結果是所有的ASP頁
都必須包含這一關鍵的檔案。如果EverythingButTheKitchenSink.inc 經過分解之後與ASP檔案的平均長度相同,
那麼被ASP分配並為緩衝的ASP檔案使用的記憶體中的一半都充滿了本來多餘沒用的資訊。
813
調用NT Task Manager/Processes 可以看到正被網站所使用著的記憶體,並觀察一下多少記憶體是由mtx.exe
(如果網站被設定成獨立的程式在IIS4上運行),dllhost.exe (如果網站被設定成獨立的程式在IIS5上運行),
或是inetinfo.exe (如果不是獨立的,見下面的圖)這些程式所使用。想要掌握記憶體增加得有多快,一個很好的
測試方法是啟動IIS後調用一個簡單的頁面來看看記憶體的大小。(看記憶體之前要調用一個ASP檔案,因為在處理第
一個ASP檔案時要建立一些普通的通用檔案)。現在在你的網站上使用其它ASP檔案,並監控每一個被使用的ASP文
件對記憶體的作用。
比如說我建立了ASP檔案。第一個檔案RunFirst.asp,是一個小檔案,在觀察記憶體之前初始化ASP資源。另外
兩個檔案除了它們所要使用的#include 檔案資訊不同以外,是完全一樣的。將這些檔案複製到你的wwwroot目錄下,
然後按順序運行RunFirst.asp, HelloWorld1.asp和 HelloWorld2.asp,執行HelloWorld1.asp和HelloWorld2.asp
之後觀察記憶體,你會發現後者使用了更多的記憶體。這是因為它使用的#include 檔案中有一個很大的未使用的程式,
BigAndUnreferenced, 它對頁面的運行結果沒有任何作用,但卻佔據了400K的記憶體。在Windows 2000 Server
w/ IIS5 上依次進行下列步驟得到的結果是:
運行RunFirst.asp 後記憶體6,104K
運行HelloWorld1.asp後記憶體 6,124K
運行HelloWorld2.asp後記憶體 6,544K
僅僅按照這個順序沒有什麼明顯的意義,顛倒裝載順序之後的結果是:
運行 RunFirst.asp 後記憶體6,096K
運行 HelloWorld2.asp後記憶體 6,536K
運行 HelloWorld1.asp 後記憶體6,540K
請注意開始和結束的記憶體數不完全一致,因為記憶體管理器根據最近的請求大塊地分配記憶體。但是相對而言,
最終的輪廓總是HelloWorld2.asp 佔據大塊的記憶體份額。本文結尾處可以下載這些簡短的代碼。瀏覽以下這些
代碼,但要分清記憶體的不同:
RunFirst.asp 是這樣的:
< %@ LANGUAGE="VBSCRIPT" % >
< HTML >
< HEAD >< TITLE >Seed Page to load general ASP resources< /TITLE >< HEAD >
< BODY >
< %
Response.Write "Seed Page Loaded"
% >
< /BODY >
< /HTML >
HelloWorld1.asp 是這樣的:
< %@ LANGUAGE="VBSCRIPT" % >
< !--#include virtual ="/HelloWorld1.inc"-- >
< HTML >
< HEAD >< TITLE >Hello World using little memory< /TITLE >< HEAD >
< BODY >
< %
SayHello
% >
< /BODY >
< /HTML >
HelloWorld1.inc代碼是:
< %
Sub SayHello
Response.Write "Hello World 1"
End Sub
% >
HelloWorld2.asp代碼是:
< %@ LANGUAGE="VBSCRIPT" % >
< !--#include virtual ="/HelloWorld2.inc"-- >
< HTML >
< HEAD >< TITLE >Hello World using a lot of memory< /TITLE >< HEAD >
< BODY >
< %
SayHello
% >
< /BODY >
< /HTML >