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少了一个变量、循环内少了一次加法运算而且循环次数是一样的,为什么反而效率更低呢?
你的method3变量比前两个少(占用内存少),过程也少一行(运算减少一个环节)
i++;
i向右移动2位,赋给s
i自加一次
s = s + 4;
i++;
s+4运算一次,再赋值给临时变量
临时变量赋值给s
i自加一次s = s + 4;
s+4运算一次,再赋值给临时变量
临时变量赋值给s因此1>3>2因为移位运算远比加法运算快。
i自加一次的速度与赋值运算比较,可能会慢一点但不会太多。
至于method2和method3哪个效率更高,就很难说了。
VS在编译成中间语言时会做一次代码优化,执行时JIT又会根据本地指令集做一次代码优化。
比如分别在x86和arm平台上运行,本地指令集不同,优化策略也不同。
所以就算拿ILDASM反汇编了看也意义不大,因为后面可能还要优化一次(根据情况不是一定会优化)。至于优化策略,比如method2中有两个变量(强调一下:变量多少只影响内存占用多少,不影响速度),
i是循环变量,其取值范围是0-200,可以优化为Byte类型,甚至视情况可能优化为8位的寄存器。
这样i<200的指令效率会很高,至于i++,对于汇编来说就是单字节的inc指令,速度极快。我只是按常理分析,没有实际试验,但应该是这样,希望对你有帮助。