實驗目的:驗證主動釋放記憶體變數是否有價值.
實驗原始代碼:
<script language=vbscript runat=server>
Dim temp1,temp2
'temp1 = space(1024*1024*50) '50MB
for i = 0 to 5000000 ' 延遲
next
'temp1="" '開關變數
'temp2 = space(1024*1024*50) '50MB
for i = 0 to 5000000 ' 延遲
next
Response.write "<meta http-equiv='refresh' content='4;url=http://localhost/memory_test.ASP'>"
</script>
記憶體變化截圖1:
截圖解釋:
CPU的波形變化是由頁面自動重新整理引起的,不必在意!我們要觀察的只是記憶體線的變化.這是原始狀態,記憶體線保持水平無變化.
好,下面實驗正式開始:
第一步:
把原始代碼中的
'temp1 = space(1024*1024*50) '50MB
前面的注釋號 ' 去掉,改成
temp1 = space(1024*1024*50) '50MB
再觀察記憶體變化一段時間
記憶體變化截圖2:
結果:
記憶體開始出現方波.
第二步:
接著也把
'temp2 = space(1024*1024*50) '50MB
前面的注釋號 ' 去掉,改成
temp2 = space(1024*1024*50) '50MB
記憶體變化截圖3:
結果:
方波比原來高了一層,成了階梯形.
第三步:
接著也把
'temp1="" '開關變數
前面的注釋號 ' 去掉,改成
temp1="" '開關變數
看看是否能釋放第一個變數所佔用的記憶體空間
記憶體變化截圖4:
結果:
很明顯,第二個波鋒不見了,看來釋放成功了.
第四步:
我們先把代碼恢複成最初的原始代碼,等記憶體平穩下來後,再把前三步快速做一次,以便在同一個截圖裡比較記憶體的變化情況.
記憶體變化截圖5:
結果:
可以很清楚的看到三種情況的不同.無倫執行時間和記憶體佔用,變數主動釋放都比不被動釋放的好.
第五步:
接著第三步的代碼,把
temp1="" '開關變數
temp2 = space(1024*1024*50) '50MB
改成
'temp1="" '開關變數
temp1 = space(1024*1024*50) '50MB
記憶體變化截圖6:
結果:
再看下步才給結論吧
第六步:
把
'temp1="" '開關變數
改成
temp1="" '開關變數
看看結果會不會有所不同
記憶體變化截圖7:
結果:
用同一個變數名,即使再重新賦值,原來的佔用過的空間也得不到釋放或替換,而且等程式被動釋放時,使用的時間也比手動的慢.
下面把
temp1="" '開關變數
temp1 = space(1024*1024*50) '50MB
調換一下兩句的位置
temp1 = space(1024*1024*50) '50MB
temp1="" '開關變數
後的截圖8:
結果:
可以看出主動釋放比被動的所需要的時間要少.
實驗結論:
主動來釋放記憶體是有作用的,不是某些人所說的要等頁面結束才能釋放掉,或者只是獃等程式結束再自動釋放,而是在執行過程中也可以人為控制的.特別是程式中需要調用到幾個大體積的變數時,儘快釋放掉已無用的變數,不但可以減輕伺服器的負擔,也可以加快程式的運行.
如果發現此實驗過程或結論有誤,歡迎指正.
最後,關於用"" ,empty 或 null 來釋放,結果基本是一樣,有興趣的可以自己親自動手比較試試.至於說用哪個來釋放變數更正規或更有效率,我無法在次實驗中判斷出來,希望知道的朋友來指教.
附:另外一個不大相關實驗
<% %>內是否有內容的區別(包括注釋)
實驗代碼:
<meta http-equiv='refresh' content='4;url=http://localhost/memory_test.ASP'>
<script language=vbscript runat=server>
Dim temp1,temp2
temp1 = space(1024*1024*50) '50MB
for i = 0 to 5000000 ' 延遲
next
'temp1="" '開關變數
'temp2 = space(1024*1024*50) '50MB
for i = 0 to 5000000 ' 延遲
next
</script>
<%
'
%>
實驗結果:
1.<% %>內無內容,記憶體不變化
2.<% %>只有一個 ' 號,記憶體開始變化
改變前後對比圖9:
結果:
<% 與 <script language=vbscript runat=server> 的先後位置無關,但似乎只要 <% %> 內有內容,就會執行 <script language=vbscript runat=server></script> 內的代碼.但只要把<script language=vbscript runat=server></script> 替換成 <% %>,就會執行<% %>內的代碼,所以以後要注意兩者的混用.
還有,在<script language=vbscript>中的這種頁面指令碼,除非頁面被關掉,否則所用過的變數不會像ASP一樣自動清除.可以從下面的代碼得到證實:
<script language=vbscript>
Dim temp
temp = space(1024*1024*50) '50MB
'temp = ""
</script>
注意去掉注釋號前後的記憶體的佔用變化,不再截圖說明.