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 >