private void method1()
        {
            int s = 0;
            int i = 1;
            while (i <= 200)
            {
                s = i * 4;
                i++;
            }
        }
 
        private void method2()
        {
            int s = 0;
            int i = 1;
            while (i <= 200)
            {
                s = s + 4;
                i++;
            }
        }        private void method3()
        {
            int s = 0;
            while (s < 800)
            {
                s = s + 4;
            }
        }这里有三个方法,我对每个方法都执行了1000W次后,发现它们的执行总时间大小为:method1>method3>method2;现在的问题是从分析这三个方法中应该method3的效率更高即执行总时间最小才是,为什么得出的结果不是呢?请高手解答。希望从IL汇编语言方面给出解析。(解释一下为什么我认为method3的效率最高)method1是作乘法,比method2作加法效率会底,method3比method2少了一个变量、循环内少了一次加法运算而且循环次数是一样的,为什么反而效率更低呢?

解决方案 »

  1.   

    你的结论不正确,method2和method3运行时间一样。你可以多试几次,互有长短,这是计时精度不同造成的。我没有环境,我猜测JIT会优化掉循环中的不用的变量的计算,method2的s = s + 4;你要是有VS,可以看下反汇编。
      

  2.   

    这还要用汇编来分析……
    你的method3变量比前两个少(占用内存少),过程也少一行(运算减少一个环节)
      

  3.   

    sorry,我看错问题了,吃完饭回来再看
      

  4.   

    s   =   i   *   4;
    i++; 
    i向右移动2位,赋给s
    i自加一次
      
    s   =   s   +   4; 
    i++; 
    s+4运算一次,再赋值给临时变量
    临时变量赋值给s
    i自加一次s   =   s   +   4; 
    s+4运算一次,再赋值给临时变量
    临时变量赋值给s因此1>3>2因为移位运算远比加法运算快。
    i自加一次的速度与赋值运算比较,可能会慢一点但不会太多。
      

  5.   

    method1毫无疑问是最慢的。
    至于method2和method3哪个效率更高,就很难说了。
    VS在编译成中间语言时会做一次代码优化,执行时JIT又会根据本地指令集做一次代码优化。
    比如分别在x86和arm平台上运行,本地指令集不同,优化策略也不同。
    所以就算拿ILDASM反汇编了看也意义不大,因为后面可能还要优化一次(根据情况不是一定会优化)。至于优化策略,比如method2中有两个变量(强调一下:变量多少只影响内存占用多少,不影响速度),
    i是循环变量,其取值范围是0-200,可以优化为Byte类型,甚至视情况可能优化为8位的寄存器。
    这样i<200的指令效率会很高,至于i++,对于汇编来说就是单字节的inc指令,速度极快。我只是按常理分析,没有实际试验,但应该是这样,希望对你有帮助。