ASP javascript Application对象的Contents和StaticObjects做Cache的一些经验
程序员文章站
2022-08-06 10:24:23
application对象内置集合有为存放简单类型设计的contents,默认application("key")就可以使用。 不过application.contents...
application对象内置集合有为存放简单类型设计的contents,默认application("key")就可以使用。
不过application.contents不能存放对象,可以存vbs数组,但是在javascript下甚至数组都不能放。
使用application.contents时,只能用丑陋的如:
for(var i=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是不允许直接访问的。
<object id="dict" runat="server" scope="application" progid="scripting.dictionary"></object>
scripting.dictionary本身的速度很快,不会对比较staticobjects集合速度造成太大影响.
dictionary的速度:
var d=new activexobject("scripting.dictionary");
for(var i=0;i<15000;i++){
d.item(i)="sdfdsffdsaf";}
1.5w次插值,172ms
当然自定义对象var d=new object(); d[i]=..更快,1.5w次只要80-90ms,不过功能弱多了,所以还是用字典.
下面看正式测试
for(var i=0;i<15000;i++){
application.lock();
application.staticobjects("dict").item(i)="sdfdsffdsaf";
application.unlock();}
时间长达6953ms,初步判断staticobjects集合的访问速度是不能满足cache的要求了,这个速度和ado oledb读sql server 2000的时间相差无几。
不过还不打算马上放弃,因为staticobjects的优势在于可以存放object,而dictionary也可以存放其它对象,这样可以做为缓存对象,而不仅仅是数据。
我在application.staticobjects("dict")里面再放入一个object:
application.staticobjects("dict").item("o")=new object();
for(var i=0;i<15000;i++){
application.lock();
application.staticobjects("dict").item("o")[i]="sdfdsffdsaf";
application.unlock();}
6656ms,快了点点.多一层object并没有降低速度,那么速度的慢并非结构复杂,而是staticobjects的访问占用。
把dict的引用预存
var t=application.staticobjects("dict");
for(var i=0;i<15000;i++){
application.lock();
t.item("o")[i]="sdfdsffdsaf";
application.unlock();}
3094ms,成功的减少一半多点的时间,js中屡试不爽的预存策略,要是把t.item("o")也预存呢?
var t=application.staticobjects("dict").item("o");
for(var i=0;i<15000;i++){
application.lock();
t[i]="sdfdsffdsaf";
application.unlock();}
125ms,终于成功了,只有application.contents的一半。看来时间主要花费在取得'引用',而不是staticobjects内存区被保护慢。staticobjects相对contents安全措施更好,因为里面要存对象。
靠dictionary强大的功能,适当的封装一下,用put(),get(),contains()等等流行方法访问,就是一个强大的cache了。
////备注
我封装了一个.sct组件;asp javascript写的,有空发上来,今天到此。
测试了取得contens和staticobjects引用的速度,在20次时都是0ms,100次大约5倍速度,500-1500次是10倍速度差距。不过取得后存取不受影响。
不过application.contents不能存放对象,可以存vbs数组,但是在javascript下甚至数组都不能放。
使用application.contents时,只能用丑陋的如:
for(var i=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是不允许直接访问的。
<object id="dict" runat="server" scope="application" progid="scripting.dictionary"></object>
scripting.dictionary本身的速度很快,不会对比较staticobjects集合速度造成太大影响.
dictionary的速度:
var d=new activexobject("scripting.dictionary");
for(var i=0;i<15000;i++){
d.item(i)="sdfdsffdsaf";}
1.5w次插值,172ms
当然自定义对象var d=new object(); d[i]=..更快,1.5w次只要80-90ms,不过功能弱多了,所以还是用字典.
下面看正式测试
for(var i=0;i<15000;i++){
application.lock();
application.staticobjects("dict").item(i)="sdfdsffdsaf";
application.unlock();}
时间长达6953ms,初步判断staticobjects集合的访问速度是不能满足cache的要求了,这个速度和ado oledb读sql server 2000的时间相差无几。
不过还不打算马上放弃,因为staticobjects的优势在于可以存放object,而dictionary也可以存放其它对象,这样可以做为缓存对象,而不仅仅是数据。
我在application.staticobjects("dict")里面再放入一个object:
application.staticobjects("dict").item("o")=new object();
for(var i=0;i<15000;i++){
application.lock();
application.staticobjects("dict").item("o")[i]="sdfdsffdsaf";
application.unlock();}
6656ms,快了点点.多一层object并没有降低速度,那么速度的慢并非结构复杂,而是staticobjects的访问占用。
把dict的引用预存
var t=application.staticobjects("dict");
for(var i=0;i<15000;i++){
application.lock();
t.item("o")[i]="sdfdsffdsaf";
application.unlock();}
3094ms,成功的减少一半多点的时间,js中屡试不爽的预存策略,要是把t.item("o")也预存呢?
var t=application.staticobjects("dict").item("o");
for(var i=0;i<15000;i++){
application.lock();
t[i]="sdfdsffdsaf";
application.unlock();}
125ms,终于成功了,只有application.contents的一半。看来时间主要花费在取得'引用',而不是staticobjects内存区被保护慢。staticobjects相对contents安全措施更好,因为里面要存对象。
靠dictionary强大的功能,适当的封装一下,用put(),get(),contains()等等流行方法访问,就是一个强大的cache了。
////备注
我封装了一个.sct组件;asp javascript写的,有空发上来,今天到此。
测试了取得contens和staticobjects引用的速度,在20次时都是0ms,100次大约5倍速度,500-1500次是10倍速度差距。不过取得后存取不受影响。