如题

解决方案 »

  1.   


    长占内存是什么意思,比如我有一个类A,有一个静态函数Fun();我用调用A.Fun(),Fun函数执行完毕后仍然占用内存吗?
      

  2.   

            static void Main(string[] args)
            {
                System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
                int i = 0;
                int iCount = 10000000;
                MyClass.Test1 t1 = new MyClass.Test1();
                sw.Start();
                for (int j = 0; j < iCount; j++)
                {
                    i = t1.add(i);
                }
                sw.Stop();
                Console.WriteLine(sw.ElapsedMilliseconds);
                sw.Reset();
                sw.Start();
                for (int j = 0; j < iCount; j++)
                {
                    i = MyClass.Test2.add(i);
                }
                sw.Stop();
                Console.WriteLine(sw.ElapsedMilliseconds);
                Console.ReadKey();
            }
        class Test1
        {
            public Int32 add(Int32 i)
            {
                return i + 1;
            }
        }    class Test2
        {
            public static Int32 add(Int32 i)
            {
                return i + 1;
            }    }结果出乎你的意料
    实例方法163ms
    静态方法166ms
    不过几乎没差别1000W次循环才有3ms的差别
      

  3.   

    楼上的测试方法有问题:
        静态与非静态效率的差异主要就集中在构造对象上面,对象构造完成后,调用1000w次,非静态方法仍然在内存中,此时的效率并不亚于静态方法,对于楼上给出的代码,我的五次测试结果为:(1) 对象构造完成后, 非静态方法的1000W            int iCount = 10000000;
                MyClass.Test1 t1 = new MyClass.Test1();
                sw.Start();
                for (int j = 0; j < iCount; j++)
                {
                    i = t1.add(i);
                }
                sw.Stop();
    (2) 静态方法的1000W            sw.Start();
                for (int j = 0; j < iCount; j++)
                {
                    i = Test2.add(i);
                }
                sw.Stop();
    结果
            第一次  第二次  第三次  第四次  第五次
    (1)       70      71      70      70      71
    (2)       69      69      67      70      70
    但是,如果在循环体内构造1000W次对象,效率差别就显而易见了:(3) 1000W的构造对象, 然后调用非静态方法            int iCount = 10000000;
                MyClass.Test1 t1 = new MyClass.Test1();
                sw.Start();
                for (int j = 0; j < iCount; j++)
                {
                    //i = t1.add(i);
                    i = new Test1().add(i);
                }
                sw.Stop();
    (4) 静态方法的1000W            sw.Start();
                for (int j = 0; j < iCount; j++)
                {
                    i = Test2.add(i);
                }
                sw.Stop();
    结果
            第一次  第二次  第三次  第四次  第五次
    (3)      180     177     175     184     191
    (4)       61      65      60      62      63
      

  4.   

    LS的 你那是实例化对象的时间太长了
    实际项目中,实际化一次就能用的对象,谁闲着蛋疼去实例化N次
      

  5.   

    有点差别  是实例方法的第一个参数是 this指针,静态方法没有this指针参数
      

  6.   

    对象的实例化指的是对象数据的实例化,而不是对象本身的实例化
    也就是创建一个对象,需要实例化的是对象的数据,而不是对象的成员方法
    不管什么对象在内存都是通过代码段和数据段来分开存储的,这两个东西是分开的,所谓的面向对象只是对用户的展现形式,并不是系统底层的真是情况,对cpu来说没有任何的对象,只有代码和数据。
    所以对象的方法本身在内存中只有一个副本,不管是否创建对象的实例始终存在与程序的代码空间
    静态方法不需要创建类的实例即可直接调用
    实例方法需要依赖类的实例才能调用,调用前增加了创建实例的开销,如果不考虑对象的创建(比如对象只创建一次),则调用静态方法和实例方法的速度是一样的。
      

  7.   

    研究这类问题前要有先决条件。如果你想用应用视角来分析“效率”,那么你就试试把一个世纪的应用程序中的几个变量变为static的,假设逻辑仍然正确的话,你可以实际去测试其执行时间,看看是快了多少?以及这种快对用户有几毛钱价值?
      

  8.   


    实际项目中,对于数据库的访问通常封装在一个类中,例如PetShop中的SqlHelper,
    不知道这个SqlHelper将会被实例化多少次?
    “需要实例化的是对象的数据”,笑话,请再回炉去好好学学《编译原理》应用的效率得看是什么应用,对于一个中小型的低运算量系统来说,一条语句的几纳秒的效率提升不算什么。
    但对于一个高运算量的系统来说,一个时钟周期的效率提升却是惊人的,当然,我们现在很少去考虑这方面的问题了。现在这个社会,要的是短平快,要的是忽悠,
    比如说最近闹的很凶的工信部4000W的事。他们的应用赚钱的效率就很高嘛。
    比如说5.19断网事故,国内绝大多数的DNS服务器的应用效率也很什么嘛。
    有人会说了,做个群集就行了嘛,
    国内某几个电信设备制造商,正为被CISCO视为对手而……,殊不知,它们几家仅是抢占了中低端路由市场,
    路由也可以做群集嘛,呵呵
    就像兵器爱好者之间的争论,F22厉害,我十几或几十个F10一起上,嘿嘿诸位都在说中国的技术如何如何的……,与M国的差距如何如何的……,
    一面在唉叹的同时,一面又在……,不想多说了。印度软件模式的确已经被中国软件“发达”地区的人深刻理解并运用得很好了。
    M国设计,阿三开发的系统,本人解开了三个嵌套查询,才以客户能够容忍的速度运行。不知者不过,知道了而不为,这就是中国。
      

  9.   

    这话也算过了点,系统的效率,只要够用就可以了。所谓够用,就是达到设计要求。
    真正对效率要求高的软件,你见过几个是用c#写的?还不都得祭出c、汇编这些杀手锏。相对于面向过程的编程,面向对象本身就意味着抽象,也意味着低效(指运行效率,而不是开发效率)。既然你选择了c#来开发,就说明你对效率的要求还不是第一位的。
      

  10.   


    说得不错,主要是看到某些人在明知某些时候使用某些方法可以提高一定的效率时,而不去考虑这些问题,有一些气愤。使用C#、Java开发系统,开发效率是第一位的,运行效率能在用户的运行环境中达到用户能容忍的程度就行了。
    头脑里一点运行效率的思想都没有,而一味追求开发时间短的人,我看,是典型的急功近利的人,这类人不适合做技术,应该改行去做营销。而开发周期短,同样有很多办法来提高开发效率的,比如说代码生成、软件工厂、中间件的运用等等。
      

  11.   

    是否Static,要看实际应用,我认为开发效率与维护成本比这个效率所创造的价值更高。
    通常软件提高时间效率或空间效率不在这些细枝末节上,纯属个人意见。
      

  12.   

        有时候不能单纯的比效率。比如你要考虑你是否要用到上面定义的非静态字段,或者有没有必要因为要使用一个静态函数,就把所有该函数中要用的变量都定义成静态函数。
        我觉得这个问题要从他们的区别和用处说,而不是单纯的从效率说。
        静态函数和非静态函数的区别,从内部角度来说,在调用的时候,非静态函数会先压一个当前对象指针(this),然后压其他参数调用函数,这样可以保证可 以找到对象地址,而静态少了压当前指针这一步(因为它本来也没有当前对象),而进行直接调用。     在类实例化的时候,整个类应该是被分成了两部分,一部分是静态字段和方法,另一部分是实例字段,当然每一部分都有各自的索引和指针,前者在一个线程内只有一份,后者是线程中每个实例有一份。