总结:三目运算符从代码角度多了代码,但是运行速度不只是与代码量有关,三目运算符从运行角度,速度是比 if else快的!
以下摘自搜索哦!
今天写了一个图片轮播的小demo,用到了判断
先试了一下if else,代码如下:
复制代码 代码如下:
if(n >= count-1){
n =0;
}else{
n ++;
}
随后代码写完了,准备优化一下代码,将此段改成了三目运算符的写法
复制代码 代码如下:
n = n >= (count-1) ? n=0 : n++
结果完全不同
随后研究了一下这两者的区别,总结为一句话:三目运算有返回值,if else没有返回值
做了如下测试:
复制代码 代码如下:
var n=1;
if(n>1){
n=0;
}else{
n++;
}
console.log(n);
输出结果:2
三目运算如下:
复制代码 代码如下:
var n=1;
n = n>1?0 : n++;
console.log(n);
输出结果为:1
插入一段其他内容:++n和n++的区别:简单地说,都是 n 自加1。区别是,n++是执行完后面的语句才加1;而++n 就先做 n+1才执行后面的语句
那么对于++n呢
if else 语句
复制代码 代码如下:
var n=1;
if(n>1){
n=0;
}else{
++n;
}
console.log(n);
输出结果:2
三目运算结果
复制代码 代码如下:
var n=1;
n = n>1?0 : ++n;
console.log(n); 输出结果为:2
可以看出if else和三目运算的区别了吧~~~
n++和++n在此验证中,没有任何区别,因为if else都是计算结果之后的,不会返回n,没有任何返回值
但是对于三目运算,n++返回的n值为n本身,++n返回的n值为n+1之后的结果
读了本文,小伙伴们是不是对js中的三目运算符和if else有了新的认识呢。
=======================================================================================================================\
今日又看到有人在讨论If/Else和三目运算符的效率差别到底有多大,但看到所给出的方案并不严谨,主要问题如下:
1.没有考虑循环自身所占用的时间
2.没有考虑赋值以及循环内的其他运算所占用的时间
因此本文给出一个改进的算法统计,在除去上述影响的情况下,给出一个相对客观的数据。如有意见,欢迎拍砖!
废话少说,上代码
Java code
public class TestIfElse {
public static void main(String[] args) {
double f = 0;
final int times = 100;
double min = 1000;
double max = 0;
//取100次平均。其实可以再多,但是耗时太长了,意义并不是很大。
for(int i=0; i<times; i++){
double df = test();
System.out.println("df["+i+"] = "+df);
f +=df;
if(min>df){
min = df;
}
if(max<df){
max = df;
}
}
f /=times;
System.out.println("------->min = "+min);
System.out.println("------->max = "+max);
System.out.println("------->ave = "+f);
}
private static double test(){
//来点计算,用处不大。
long sum = -1;
//循环次数,有点大哦,自己悠着点调
final int max = 100000000;
//下面给出一个包含循环和计算的耗时统计,作为一个基础。后面的统计必然包含此部分时间
long timeS = System.currentTimeMillis();
for(int i=0; i<max; i++){
sum = i+i;
}
long timeE = System.currentTimeMillis();
long delta = timeE - timeS;
//计算出一个布尔值,免得后面还要计算而占用时间,造成误差。
boolean flag = sum>0;
//下面是If/Else(包含循环和计算)的耗时统计,真实耗时应当除去上面的基准值
long timeS1 = System.currentTimeMillis();
for(int i=0; i<max; i++){
if(flag){
sum = i+i;
}else{
sum = i+i;
}
}
long timeE1 = System.currentTimeMillis();
long delta1 = timeE1 - timeS1;
//这是真实的耗时计算
long realIfElse = delta1-delta;
//下面是三目运算符(包含循环和计算)的耗时统计,真实耗时同样应当除去前面的基准值
long timeS2 = System.currentTimeMillis();
for(int i=0; i<max; i++){
sum = flag?i+i:i+i;
}
long timeE2 = System.currentTimeMillis();
long delta2 = timeE2 - timeS2;
//这是真实的耗时计算
long realTri = delta2-delta;
//返回耗时比率,以反映效率差别
double f = (double)realIfElse / realTri;
return f;
}
}
结果:
Java code
?
1
2
3
------->min = 1.9841269841269842
------->max = 3.5161290322580645
------->ave = 2.6170264636067144
看到了吧?If/Else耗时是三目运算符的2.6倍之多!
----------------------------------------------------------------------------------------------------------------------
可见后者比前者多了两条指令。
If-else无论在何种情况下(在if中或者else中),都是通过先将需要赋的变量值传给寄存器然后再通过寄存器赋值给temp变量 。即
mov edx,b; mov temp,edx ;
然而,对于三目运算,它其中一步却增加多了一个临时变量。
mov ecx,b;mov NEWTEMP,ecx;
mov edx,NEWTEMP;mov temp;edx;
以下是一个同学给我的答案(他从编译原理课上学的):
因为三目运算是先运算,再赋值!
例如 :
temp = a > b ? a : b ;
a > b ? a : b 是运算, temp = (a > b ? a : b )是赋值。
所以在三目的汇编里面 a,b,temp地址 为10h,14h 18h 无论a>b的结果怎样,都有先将它后 面的结果保存在地址为 24h 的中间变量里面 ,然后再 赋值给地址为 18h 的temp变量中!
而 if 语句是直接赋值 ,不存在运算,所以快了一点。
然后根据这原理,可以知道 ++i 比 i++ 快, x+=y 比 x=x+y 快。
不过,我们写程序的时候可以忽略它们,因为这种东西,编译器已经帮我们优化了!!!