关于ASP Cache的改进探讨

在ASP中我们难免使用一些Cache来缓存各种常用数据。这些数据可能是基本类型,可能是数组,可能是对象。而简单地使用Application难免会造成一些性能问题。比如缓存丢失、网站运行速度减慢等。

由于平时应用中,我们往往要同时使用多个变量(比如网站基本配置参数),而这些变量的数量十分多,我并不希望将他们一一划分开来储存进单独的Application中去。我更期待我能只读取一次Application,然后就可以将整个变量串全部获取出来。我也不是十分想用数组,因为下标经常会造成逻辑上的混乱,给引用带来不便。

Scripting.Dictionary是一个十分切合我这些应用的组件。我可以使用类似Object.Item(“Key”)的方式来读取我所需求的各个变量。而Scripting.Dictionary本身的处理速度也是十分快的。现在推崇的对Application一个比较理想的改进,即是将Dictionary与Application的StaticObjects结合起来。在global.asa中加入

然后使用 Application.StaticObjects("dict") 来引用这个Dictionary对象。

这样的改进效率十分高。几乎没有影响Application的效率(甚至有了部分提升!)。

创建dictionary对象50000次花费时间:1.046875s
dictionary写50000次花费时间:.3125s
dictionary读50000次花费时间:.3125s
写Application 15000次花费时间:5.234375s
读Application 15000次花费时间:5.203125s
写Application dictionary 15000次花费时间:4.921875s
读Application dictionary 15000次花费时间:4.5625s

以上代码中,Application Dictionary的引用语句是

Application.StaticObjects("dict").Item(i)

可以看到,就这样,效率已经十分令人满意了。但是我们还不知足。可以猜想,是

Application.StaticObjects("dict")这个引用拖慢了语句的速度,于是我们尝试可以加上一句引用语句来提速。结果如下,让人十分满意

做引用改进后:Set d = Application.StaticObjects("dict")
引用Application dictionary 15000次花费时间:1.0625s
写Application dictionary 15000次花费时间:3.234375s
读Application dictionary 15000次花费时间:3.3125s

“引用Application dictionary 15000次”测试的是

Set d = Application.StaticObjects("dict")

这句语句的运行效率。而实际运行中,这句话的应用并没有那么频繁(同一页面我们只要做一次引用就足够了)。由此看见,引用之后效率相当可观

 

在长期的ASP应用中,我也曾设想设计一个ASP文件CACHE机制。将CACHE以赋值语句的形式存入ASP文件中(即生成一堆变量),然后在应用页面中INCLUDE。本想INCLUDE文件的操作IIS会进行编译缓存,所以效率应该比APPLICATION还要高。为了证明这个设想,我也做了一个测试。j结果:

生成15000个变量(Execute)并赋值花费时间:.359375s
15000次include文件(包含5000个赋值语句)花费时间:19.60938s
15000次include文件(空文件)花费时间:18.92188s

大吃一惊!效率太低了!

由此看来,也许最高效的办法是将变量存入Application中去,然后Execute?

测试文件代码如下。有兴趣的读者可以自行验证

<%
Dim d,aItems,i,t

t=timer()
For i=0 to 49999
    Set d = Server.CreateObject("Scripting.Dictionary")
Next
response.write "创建dictionary对象50000次花费时间:"& (timer()-t) &"s
"

t=timer()
'写5W次
For i=0 to 49999
    d.Item(i)=i
Next
response.write "dictionary写50000次花费时间:"& (timer()-t) &"s
"

t=timer()
'读5W次
For i=0 to 49999
    aItems = d.Item(i)
Next
response.write "dictionary读50000次花费时间:"& (timer()-t) &"s
"

'释放资源
Set d = Nothing

t=timer()
'写1W次
Application.Lock
For i=0 to 14999
    Application("x"& i)=i
Next
Application.UnLock
response.write "写Application 15000次花费时间:"& (timer()-t) &"s
"

t=timer()
'读1W次
For i=0 to 14999
    aItems = Application("x"& i)
Next
response.write "读Application 15000次花费时间:"& (timer()-t) &"s
"

t=timer()
Application.Lock
For i=0 to 14999
    Application.StaticObjects("dict").Item(i)=i
Next
Application.UnLock
response.write "写Application dictionary 15000次花费时间:"& (timer()-t) &"s
"

t=timer()
For i=0 to 14999
    aItems = Application.StaticObjects("dict").Item(i)
Next
response.write "读Application dictionary 15000次花费时间:"& (timer()-t) &"s
"

response.write "做引用改进后:Set d = Application.StaticObjects(""dict"")
"
'改进后
t=timer()
For i=0 to 14999
    Set d = Application.StaticObjects("dict")
Next
response.write "引用Application dictionary 15000次花费时间:"& (timer()-t) &"s
"

t=timer()
Application.Lock
For i=0 to 14999
    d.Item(i)=i
Next
Application.UnLock
response.write "写Application dictionary 15000次花费时间:"& (timer()-t) &"s
"

t=timer()
For i=0 to 14999
    aItems = d.Item(i)
Next
response.write "读Application dictionary 15000次花费时间:"& (timer()-t) &"s
"

Set d=Nothing

'测试eval语句
t=timer()
For i=0 to 14999
    '生成1.5w个变量
    Execute "Dim x"&i & vbNewLine &"x"&i &"="& i & vbNewLine
Next
response.write "生成15000个变量(Execute)并赋值花费时间:"& (timer()-t) &"s
"

'测试include
'首先声明变量
For i=0 to 4999
    '生成1.5w个变量
    Execute "Dim var"&i
Next
t=timer()
For i=0 to 14999
    %> <%
Next
response.write "15000次include文件(包含5000个赋值语句)花费时间:"& (timer()-t) &"s
"

t=timer()
For i=0 to 14999
    %> <%
Next
response.write "15000次include文件(空文件)花费时间:"& (timer()-t) &"s
"

%>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值