ASP javascript Application对象的Contents和StaticObjects做Cache的一些经验
2018-09-06 10:34
  Application对象内置集合有为存放简单类型设计的Contents,默认Application(key)就可以使用。 
不过tents不能存放对象,可以存vbs数组,但是在javascript下甚至数组都不能放。 
使用Application.Contents时,只能用丑陋的如: 
for(vari=0;i<15000;i++){ 
Application.Lock(); 
//Application.Contents(i)=sdfdsffdsaf; 
Application(i)=sdfdsffdsaf; 
Application.Unlock();} 
在这里往Application.Contents存放了1.5w个String,共花费时间234ms. 
改用Application.StaticObjects后: 
定义一个Dictionary作为StaticObject,用于存放数据,因为StaticObject是不允许直接访问的。 
<objectid=dictrunat=serverscope=Applicationprogid=Scripting.Dictionary></object> 
Scripting.Dictionary本身的速度很快,不会对比较StaticObjects集合速度造成太大影响. 
Dictionary的速度: 
vard=newActiveXObject(Scripting.Dictionary); 
for(vari=0;i<15000;i++){ 
d.Item(i)=sdfdsffdsaf;} 
1.5w次插值,172ms 
当然自定义对象vard=newObject();d[i]=..更快,1.5w次只要80-90ms,不过功能弱多了,所以还是用字典. 
下面看正式测试 
for(vari=0;i<15000;i++){ 
Application.Lock(); 
Application.StaticObjects(dict).Item(i)=sdfdsffdsaf; 
Application.Unlock();} 
时间长达6953ms,初步判断StaticObjects集合的访问速度是不能满足Cache的要求了,这个速度和ADOOLEDB读sqlserver2000的时间相差无几。 
不过还不打算马上放弃,因为StaticObjects的优势在于可以存放Object,而Dictionary也可以存放其它对象,这样可以做为缓存对象,而不仅仅是数据。 
我在Application.StaticObjects(dict)里面再放入一个Object: 
Application.StaticObjects(dict).Item(o)=newObject(); 
for(vari=0;i<15000;i++){ 
Application.Lock(); 
Application.StaticObjects(dict).Item(o)[i]=sdfdsffdsaf; 
Application.Unlock();} 
6656ms,快了点点.多一层Object并没有降低速度,那么速度的慢并非结构复杂,而是StaticObjects的访问占用。 
把dict的引用预存 
vart=Application.StaticObjects(dict); 
for(vari=0;i<15000;i++){ 
Application.Lock(); 
t.Item(o)[i]=sdfdsffdsaf; 
Application.Unlock();} 
3094ms,成功的减少一半多点的时间,js中屡试不爽的预存策略,要是把t.Item(o)也预存呢? 
vart=Application.StaticObjects(dict).Item(o); 
for(vari=0;i<15000;i++){ 
Application.Lock(); 
t[i]=sdfdsffdsaf; 
Application.Unlock();} 
125ms,终于成功了,只有Application.Contents的一半。看来时间主要花费在取得引用,而不是StaticObjects内存区被保护慢。StaticObjects相对Contents安全措施更好,因为里面要存对象。 
靠Dictionary强大的功能,适当的封装一下,用put(),get(),contains()等等流行方法访问,就是一个强大的Cache了。 
////备注 
我封装了一个.sct组件;aspjavascript写的,有空发上来,今天到此。 
测试了取得Contens和StaticObjects引用的速度,在20次时都是0ms,100次大约5倍速度,500-1500次是10倍速度差距。不过取得后存取不受影响。 
下一篇:asp最简单最实用的计数器
文章标题:ASP javascript Application对象的Contents和StaticObjects做Cache的一些经验
文章链接:http://soscw.com/index.php/essay/8669.html