向大家询问一个GetObject的效率问题 目前在asp开发中,我使用到GetObject但我不知道它的原理及效率怎么样,在网上搜索这样的资料又太少。比如我写了一个类,我用new的方式效率高呢? 还是将这个类放到sct文件中,然后用GetObject效率高? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对ASP来说,GetObject已经够快了实际上,GetObject是挺慢的…… GetObject 需要先访问注册表,找到CLSID,然后根据CLSID找到类存放的文件路径,再创建对象New 是直接创建对象,不需要通过找注册表和COM系统当然是New快一点了。不过如果你New的是一个COM对象的话,这两个相差不是太大 如果是个外部对象,New也一样,显然楼主的对象应该是个对象,就是New系统也要创建它,所以我感觉两者若有差别也微不足道 不是,我GetObject传进去的是个sct文件的地址 一样的道理,你调用 GetObject("Test.sct")时候系统会做以下动作1、检查Test.sct是否存在2、打开Test.sct文件,将全部内容加载到内存3、运行语法分析程序,检查是否有语法错误,并进行预编译(脚本也有一个预编译过程)4、创建对象并返回(创建对象是一个复杂的过程,尤其是对sct)当你用new的时候,有个隐含的前提,是代码环境已经允许你使用new了也就是说,你要new的对象已经被加载到当前进程的内存空间了,并且通过语法检测剩下就是只需要创建对象了'================================================这样,理论上,在一个N次For循环里面使用GetObject就比new要多做 3*N 个步骤而且文件IO是一个很慢的过程当然,操作系统不会那么傻,或许会有一个缓存机制,这个具体细节我也不是很清楚你可以自己写一个循环的测试程序来估算一下 不知道 sct 是什么文件,不过可以用 xls 文件举例。在 Excel 中,每个的 xls 只能被打开一次,如果有多个 Excel 想同时打开同一个 xls 文件,只有第一个能成功。而用 GetObject 指定 xls 文件的方式,却可以让多个进程取得当前已打开的 xls 实例。你的 asp 应该不止一个用户吧,如果想要同时操作的话用 GetObject 比较合适。 sct 是 Windows Script Host 里面的一个小玩意相当于用 VBScript写一个COM了 非常感谢大家的指点,尤其是 eglic我现在使用的是每个类分别写到asp文件中,asp中有include命令,这样呢,当我们打开asp页面的时候,就事先将这些类载入了,剩下只需要new就可以使用了。而使用sct呢,不需要事先载入,只在调的时候临时去GetObject就可以了。按照您的分析,那么是直接new方式效率比较高了。To:Tiger_Zhao 确实asp是由很多用户访问的,但这个sct,使用一次后,真的会在服务器端做缓存吗?以后使用就相当于直接调系统对象? @@按照您的分析,那么是直接new方式效率比较高了。也不能这么说,得根据具体情况不过在ASP里面还是建议你用include吧,这样可以保证系统的独立性免得在走COM绕一次建议你把sct改成ASP的Class@@确实asp是由很多用户访问的,但这个sct,使用一次后,真的会在服务器端做缓存吗?以后使用就相当于直接调系统对象?既然是在ASP里面,那可以肯定是有缓存的,这个是由IIS和Windows Script Host以及COM系统共同完成的 多进程之间发生异步等待很正常,那么就无法避免用户 A 操作 sct 的途中用户 B 也请求操着 sct,与是否做了缓存没有关系。 恩,并发的时候,异步等待的开销远超过IO时间不考虑并发的话,IO的开销还是不小的 那么include方式不也存在异步等待吗? 异步等待常发生在COM系统内……因为COM是不支持多线程的include是吧文件加载到同一个进程空间内,不需要绕行COM系统因此碰到异步等待的概率会低很多…… VB同时链接本地和远程服务器 VB的X++。。。 可不可以写程序自动提取outlook中的附件? Comm1.Output = "ATDT 17908" + vbCr,拔号之后,按一个“1”,怎么写? 还是调用vc写的dll的问题。 VB 6.0图标菜单的问题 请提供asp中使用数据库控件的相关思路 DataGrid控制问题 ! 保存用户名和密码 一千零的问题 VB 读取INI文件里面的所有Section及每个Section下面的Keyword如何实现 递归可以控制遍历深度吗?怎么控制
不是,我GetObject传进去的是个sct文件的地址
一样的道理,你调用 GetObject("Test.sct")时候
系统会做以下动作
1、检查Test.sct是否存在
2、打开Test.sct文件,将全部内容加载到内存
3、运行语法分析程序,检查是否有语法错误,并进行预编译(脚本也有一个预编译过程)
4、创建对象并返回(创建对象是一个复杂的过程,尤其是对sct)当你用new的时候,有个隐含的前提,是代码环境已经允许你使用new了
也就是说,你要new的对象已经被加载到当前进程的内存空间了,并且通过语法检测
剩下就是只需要创建对象了'================================================
这样,理论上,在一个N次For循环里面使用GetObject就比new要多做 3*N 个步骤
而且文件IO是一个很慢的过程当然,操作系统不会那么傻,或许会有一个缓存机制,这个具体细节我也不是很清楚
你可以自己写一个循环的测试程序来估算一下
在 Excel 中,每个的 xls 只能被打开一次,如果有多个 Excel 想同时打开同一个 xls 文件,只有第一个能成功。
而用 GetObject 指定 xls 文件的方式,却可以让多个进程取得当前已打开的 xls 实例。你的 asp 应该不止一个用户吧,如果想要同时操作的话用 GetObject 比较合适。
不过在ASP里面还是建议你用include吧,这样可以保证系统的独立性
免得在走COM绕一次建议你把sct改成ASP的Class@@确实asp是由很多用户访问的,但这个sct,使用一次后,真的会在服务器端做缓存吗?以后使用就相当于直接调系统对象?既然是在ASP里面,那可以肯定是有缓存的,这个是由IIS和Windows Script Host以及COM系统共同完成的
恩,并发的时候,异步等待的开销远超过IO时间不考虑并发的话,IO的开销还是不小的