實驗目的:驗證主動釋放內存變量是否有價值.
實驗原始代碼:
<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
<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>
再觀察內存變化一段時間
內存變化截圖2:
結果:內存開始出現方波。
第二步:接著也把
'temp2 = space(1024*1024*50) '50MB
前面的注釋號 ' 去掉,改成
temp2 = space(1024*1024*50) '50MB
<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>
內存變化截圖3:
結果:方波比原來高了一層,成了階梯形。
第三步:接著也把
'temp1="" '開關變量
前面的注釋號 ' 去掉,改成
temp1="" '開關變量
<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>
看看是否能釋放第一個變量所占用的內存空間
內存變化截圖4:
結果:很明顯,第二個波鋒不見了,看來釋放成功了。
第四步: 我們先把代碼恢復成最初的原始代碼,等內存平穩下來後,再把前三步快速做一次,以便在同一個截圖裡比較內存的變化情況。
內存變化截圖5:
結果:可以很清楚的看到三種情況的不同。無倫執行時間和內存占用,變量主動釋放都比不被動釋放的好。
第五步:接著第三步的代碼,把
temp1="" '開關變量
temp2 = space(1024*1024*50) '50MB
改成
'temp1="" '開關變量
temp1 = space(1024*1024*50) '50MB
<script language=vbscript runat=server>
Dim temp1,temp2
temp1 = space(1024*1024*50) '50MB
for i = 0 to 5000000 ' 延遲
next
'temp1="" '開關變量
temp1 = 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>
內存變化截圖6:
結果:再看下步才給結論吧
第六步:把
'temp1="" '開關變量
改成
temp1="" '開關變量
<script language=vbscript runat=server>
Dim temp1,temp2
temp1 = space(1024*1024*50) '50MB
for i = 0 to 5000000 ' 延遲
next
temp1="" '開關變量
temp1 = 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>
看看結果會不會有所不同
內存變化截圖7:
結果:用同一個變量名,即使再重新賦值,原來的占用過的空間也得不到釋放或替換(截圖6說明),而且等程序被動釋放時,使用的時間也比手動的慢(綜合截圖6、7說明)。
下面把
temp1="" '開關變量
temp1 = space(1024*1024*50) '50MB
調換一下兩句的位置
temp1 = space(1024*1024*50) '50MB
temp1="" '開關變量
<script language=vbscript runat=server>
Dim temp1,temp2
temp1 = space(1024*1024*50) '50MB
for i = 0 to 5000000 ' 延遲
next
temp1 = space(1024*1024*50) '50MB
temp1="" '開關變量
for i = 0 to 5000000 ' 延遲
next
Response.write "<meta http-equiv='refresh' content='4;url=http://localhost/memory_test.ASP'>"
</script>
後的截圖8:
結果:可以看出主動釋放比被動的所需要的時間要少(波峰尖)
實驗結論:主動來釋放內存是有作用的,不是某些人所說的要等頁面結束才能釋放掉,或者只是呆等程序結束再自動釋放,而是在執行過程中也可以人為控制的。特別是程序中需要調用到幾個大體積的變量時,盡快釋放掉已無用的變量,不但可以減輕服務器的負擔,也可以加快程序的運行。
如果發現此實驗過程或結論有誤,歡迎指正。
最後,關於用"",empty 或 null 來釋放,結果基本是一樣,有興趣的可以自己親自動手比較試試。至於說用哪個來釋放變量更正規或更有效率,我無法在此實驗中判斷出來,希望知道的朋友來指教。
(出處:Viphot)