目前在asp开发中,我使用到GetObject但我不知道它的原理及效率怎么样,在网上搜索这样的资料又太少。比如我写了一个类,我用new的方式效率高呢? 还是将这个类放到sct文件中,然后用GetObject效率高?

解决方案 »

  1.   

    对ASP来说,GetObject已经够快了实际上,GetObject是挺慢的……
      

  2.   

    GetObject 需要先访问注册表,找到CLSID,然后根据CLSID找到类存放的文件路径,再创建对象New 是直接创建对象,不需要通过找注册表和COM系统当然是New快一点了。不过如果你New的是一个COM对象的话,这两个相差不是太大
      

  3.   

    如果是个外部对象,New也一样,显然楼主的对象应该是个对象,就是New系统也要创建它,所以我感觉两者若有差别也微不足道
      

  4.   


    不是,我GetObject传进去的是个sct文件的地址
      

  5.   


    一样的道理,你调用 GetObject("Test.sct")时候
    系统会做以下动作
    1、检查Test.sct是否存在
    2、打开Test.sct文件,将全部内容加载到内存
    3、运行语法分析程序,检查是否有语法错误,并进行预编译(脚本也有一个预编译过程)
    4、创建对象并返回(创建对象是一个复杂的过程,尤其是对sct)当你用new的时候,有个隐含的前提,是代码环境已经允许你使用new了
    也就是说,你要new的对象已经被加载到当前进程的内存空间了,并且通过语法检测
    剩下就是只需要创建对象了'================================================
    这样,理论上,在一个N次For循环里面使用GetObject就比new要多做 3*N 个步骤
    而且文件IO是一个很慢的过程当然,操作系统不会那么傻,或许会有一个缓存机制,这个具体细节我也不是很清楚
    你可以自己写一个循环的测试程序来估算一下
      

  6.   

    不知道 sct 是什么文件,不过可以用 xls 文件举例。
    在 Excel 中,每个的 xls 只能被打开一次,如果有多个 Excel 想同时打开同一个 xls 文件,只有第一个能成功。
    而用 GetObject 指定 xls 文件的方式,却可以让多个进程取得当前已打开的 xls 实例。你的 asp 应该不止一个用户吧,如果想要同时操作的话用 GetObject 比较合适。
      

  7.   

    sct 是 Windows Script Host 里面的一个小玩意相当于用 VBScript写一个COM了
      

  8.   

    非常感谢大家的指点,尤其是 eglic我现在使用的是每个类分别写到asp文件中,asp中有include命令,这样呢,当我们打开asp页面的时候,就事先将这些类载入了,剩下只需要new就可以使用了。而使用sct呢,不需要事先载入,只在调的时候临时去GetObject就可以了。按照您的分析,那么是直接new方式效率比较高了。To:Tiger_Zhao 确实asp是由很多用户访问的,但这个sct,使用一次后,真的会在服务器端做缓存吗?以后使用就相当于直接调系统对象?
      

  9.   

    @@按照您的分析,那么是直接new方式效率比较高了。也不能这么说,得根据具体情况
    不过在ASP里面还是建议你用include吧,这样可以保证系统的独立性
    免得在走COM绕一次建议你把sct改成ASP的Class@@确实asp是由很多用户访问的,但这个sct,使用一次后,真的会在服务器端做缓存吗?以后使用就相当于直接调系统对象?既然是在ASP里面,那可以肯定是有缓存的,这个是由IIS和Windows Script Host以及COM系统共同完成的
      

  10.   

    多进程之间发生异步等待很正常,那么就无法避免用户 A 操作 sct 的途中用户 B 也请求操着 sct,与是否做了缓存没有关系。
      

  11.   


    恩,并发的时候,异步等待的开销远超过IO时间不考虑并发的话,IO的开销还是不小的
      

  12.   

    那么include方式不也存在异步等待吗?
      

  13.   

    异步等待常发生在COM系统内……因为COM是不支持多线程的include是吧文件加载到同一个进程空间内,不需要绕行COM系统因此碰到异步等待的概率会低很多……